祖先没赋值,纠结了好久,长个教训

1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<string.h> 5 int n; 6 7 int set[510]; 8 int f[510],a[510],b[510]; 9 struct PP 10 { 11 int u,v; 12 int pri; 13 }d[30003]; 14 int cmp(const void *a,const void *b) 15 { 16 struct PP *c,*d; 17 c=(struct PP*)a; 18 d=(struct PP*)b; 19 return c->pri-d->pri; 20 } 21 int find(int x) 22 { 23 if(x==set[x]) 24 return x; 25 if(x!=set[x]) 26 set[x]=find(set[x]); 27 28 } 29 int main() 30 { 31 int i,j,k,m,t,l; 32 int x,y,z,dis; 33 scanf("%d",&l); 34 while(l--) 35 { 36 scanf("%d%d%d",&n,&m,&t); 37 for(i=1;i<=n;i++) 38 { 39 set[i]=i; 40 } 41 k=0; 42 for(i=1;i<=m;i++) 43 { 44 scanf("%d%d%d",&x,&y,&z); 45 d[k].u=x; 46 d[k].v=y; 47 d[k].pri=z; 48 k++; 49 } 50 int p,q; 51 for(i=1;i<=t;i++) 52 { 53 scanf("%d",&dis); 54 scanf("%d",&p); 55 p=find(p);//必须将其祖先赋值 56 for(j=1;j<dis;j++) 57 { 58 scanf("%d",&q); 59 set[find(q)]=set[p];//让他们的祖先值一致 60 } 61 62 } 63 qsort(d,k,sizeof(d[0]),cmp); 64 int sum=0; 65 int f1,f2,c,t; 66 for(i=0;i<k;i++) 67 { 68 c=d[i].u; 69 t=d[i].v; 70 f1=find(c); 71 f2=find(t); 72 if(f1!=f2)//祖先不一样了,将其加上 73 { 74 sum+=d[i].pri; 75 set[f1]=f2; 76 } 77 } 78 int h=0; 79 for(i=1;i<=n;i++) 80 if(set[i]==i) 81 h++; 82 if(h==1) 83 printf("%d\n",sum); 84 else 85 printf("-1\n"); 86 } 87 return 0; 88 }