3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
3 1 0
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,j,p; int r[5000]; struct node { int x,y,w,k; }line[5000],Nline[5000],Mline[5000]; bool cmp(node a,node b) { return a.w<b.w; } int root(int x) { return r[x]==x ? x:root(r[x]); } int Kruskal() { int ans=0; for(int i=1;i<=5000;i++) r[i]=i; if(j!=1&&j!=2) sort(Nline+1,Nline+j-1,cmp); if(p!=1&&j!=2) sort(Mline+1,Mline+p-1,cmp); for(int i=1;i<=j-1;i++) { int x=root(Nline[i].x); int y=root(Nline[i].y); if(x!=y) { r[x]=y; } } for(int i=1;i<=p-1;i++) { int x=root(Mline[i].x); int y=root(Mline[i].y); if(x!=y) { r[x]=y; ans+=Mline[i].w; } } cout<<ans<<endl; } int main() { while(scanf("%d",&n),n) { p=j=1; for(int i=1;i<=n*(n-1)/2;i++) { scanf("%d%d%d%d",&line[i].x,&line[i].y,&line[i].w,&line[i].k); if(line[i].k) Nline[j++]=line[i]; else Mline[p++]=line[i]; } Kruskal(); } return 0; }
HDU 1879 继续畅通工程.,布布扣,bubuko.com
原文:http://blog.csdn.net/darwin_/article/details/23541435