hdu 3371Connect the Cities

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 }

 

posted on 2012-08-13 21:44  仁者无敌8勇者无惧  阅读(124)  评论(0编辑  收藏  举报

导航