杭电3371Connect the Cities

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

View Code
 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 }

 

posted @ 2012-07-31 11:11  zlyblog  阅读(170)  评论(0)    收藏  举报