zcmu——4941: 繼續暢通工程(貪心+並查集)
阿新 • • 發佈:2018-12-10
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; #define maxn 10010 int father[110]; struct node{ int x,y,z,d; }a[maxn],b[maxn],c[maxn]; bool cmp(node a,node b) { return a.z<b.z; } void init(int n) { for(int i=1;i<=n;i++) father[i]=i; } int findFather(int x) { int a=x; while(x!=father[x]) { x=father[x]; } while(a!=father[a]) { int z=a; a=father[a]; father[z]=x; } return x; } void Union(int a,int b) { int faA=findFather(a); int faB=findFather(b); if(faA!=faB) father[faA]=faB; } int main() { int n; while(~scanf("%d",&n)&&n!=0) { init(n); int m=n*(n-1)/2; int num1=0; for(int i=0;i<m;i++) { scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].z,&a[i].d); if(a[i].d==1) { Union(a[i].x,a[i].y); } else //if(a[i].d==0) { // num1++; b[num1].x=a[i].x; b[num1].y=a[i].y; b[num1].z=a[i].z; //b[num1].d=a[i].d; num1++; } } sort(b,b+num1,cmp); int cnt=0; for(int i=0;i<num1;i++) { if(findFather(b[i].x)!=findFather(b[i].y)) { Union(b[i].x,b[i].y); cnt+=b[i].z; } } printf("%d\n",cnt); } return 0; }