标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15569 Accepted Submission(s): 4108
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int father[505]; int dep[505]; struct Seg { int x,y,len; } seg[25010]; int cmp(Seg a,Seg b) { return a.len <b.len; } int _find(int x) { if(x==father[x])return x; return _find(father[x]); } int main() { int tcase ; scanf("%d",&tcase); while(tcase--) { int n,m,t; scanf("%d%d%d",&n,&m,&t); for(int i=1; i<=n; i++) { father[i]=i; dep[i]=0; } for(int i=0; i<m; i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); seg[i].x=x; seg[i].y=y; seg[i].len=z; } for(int i=0; i<t; i++) { int num,x; scanf("%d%d",&num,&x); num--; while(num--) { int y; scanf("%d",&y); x = _find(x); y = _find(y); if(x!=y) { if(dep[x]==dep[y]) { father[x] = y; dep[y]++; } else if(dep[x]<dep[y]) { father[x] = y; } else { father[y]=x; } } } } sort(seg,seg+m,cmp); int sum=0; for(int i=0; i<m; i++) { int x = _find(seg[i].x); int y = _find(seg[i].y); if(x!=y) { if(dep[x]==dep[y]) { father[x] = y; dep[y]++; } else if(dep[x]<dep[y]) { father[x] = y; } else { father[y]=x; } sum+=seg[i].len; } } int ans=0; for(int i=1; i<=n; i++) { if(father[i]==i) ans++; } if(ans==1) printf("%d\n",sum); else printf("-1\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5325678.html