//hdu 4009
int in[N],pre[N];
int rt,n,total;
int vis[N],id[N];
int mtree(){
int ans=0;
while(1){
memset(in,0x3f,sizeof(in));
for(int i=0;i<total;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(u==v)continue;
if(in[v]>w){
in[v]=w;
pre[v]=u;
}
}
for(int i=0;i<n;i++)if(i!=rt){
if(in[i]==INF)return -1;
ans+=in[i];
}
memset(vis,-1,sizeof(vis));
memset(id,-1,sizeof(id));
vis[rt]=rt;
int cnt=0;
for(int i=0;i<n;i++)if(vis[i]==-1){
int j=i;
while(vis[j]==-1){
vis[j]=i;
j=pre[j];
}
if(vis[j]!=i)continue;
for(int k=pre[j];k!=j;k=pre[k]){
id[k]=cnt;
}
id[j]=cnt++;
}
if(cnt==0)return ans;
for(int i=0;i<n;i++)if(id[i]==-1){
id[i]=cnt++;
}
int m=0;
for(int i=0;i<total;i++){
int u=e[i].u,v=e[i].v,w=e[i].w-in[v];
if(id[u]==id[v])continue;
e[m++]=Edge(id[u],id[v],w);
}
total=m;
n=cnt;
rt=id[rt];
}
}
最小树形图
最新推荐文章于 2024-12-23 14:25:11 发布