http://acm.hdu.edu.cn/showproblem.php?pid=3371
View Code
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int root[510]; 5 struct Node 6 { 7 int start,end; 8 int len; 9 }node[25010]; 10 int cmp(const void*x,const void*y) 11 { 12 return (*(Node*)x).len-(*(Node*)y).len; 13 } 14 int find(int x) 15 { 16 int r=x; 17 while(r!=root[r]) 18 r=root[r]; 19 int i=x,j; 20 while(i!=r) 21 { 22 j=root[i]; 23 root[i]=r; 24 i=j; 25 } 26 return r; 27 } 28 void merge(int x,int y) 29 { 30 int fx,fy; 31 fx=find(x); 32 fy=find(y); 33 if(fx!=fy) root[fx]=fy; 34 } 35 int main() 36 { 37 38 int t; 39 int n,m,k; 40 int i,j,kk; 41 int a,b,c; 42 scanf("%d",&t); 43 while(t--) 44 { 45 scanf("%d%d%d",&n,&m,&k); 46 for(i=1;i<=n;i++) 47 root[i]=i; 48 for(i=0;i<m;i++) 49 { 50 scanf("%d%d%d",&node[i].start,&node[i].end,&node[i].len); 51 } 52 qsort(node,m,sizeof(node[0]),cmp); 53 for(i=1;i<=k;i++) 54 { 55 scanf("%d%d%d",&kk,&a,&b); 56 merge(a,b); 57 for(j=3;j<=kk;j++) 58 { 59 scanf("%d",&c); 60 merge(a,c); 61 } 62 } 63 int sum=0; 64 for(i=0;i<m;i++) 65 { 66 if(find(node[i].start)!=find(node[i].end)) 67 { 68 sum+=node[i].len; 69 merge(node[i].start,node[i].end); 70 } 71 } 72 int count=0; 73 for(i=1;i<=n;i++) 74 { 75 if(find(i)==i) count++; 76 } 77 if(count>1) printf("-1\n"); 78 else printf("%d\n",sum); 79 } 80 }