HDU 1301 Jungle Roads(裸最小生成树)

题目链接

今天做了好几个模版最小生成树。。。贴一个kurskral.

 1 /*
 2 HDU 1301 Jungle Roads
 3 最小生成树Kurskal模版
 4 */
 5 #include <stdio.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8 int num,sum;
 9 int o[101];
10 struct edge
11 {
12     int sv;
13     int ev;
14     int w;
15 } p[5000];
16 int cmp(const void *a,const void *b)
17 {
18     return (*(struct edge *)a).w > (*(struct edge *)b).w ? 1:-1;
19 }
20 int find(int x)
21 {
22     int r = x,t;
23     while(x != o[x])
24         x = o[x];
25     while(r != x)
26     {
27         t = o[r];
28         o[r] = x;
29         r = t;
30     }
31     return x;
32 }
33 void merge(int x,int y,int w)
34 {
35     x = find(x);
36     y = find(y);
37     if(x != y)
38     {
39         o[x] = y;
40         sum += w;
41         num ++;
42     }
43 }
44 int main()
45 {
46     int i,j,n,m,ss,vv,ww,k;
47     char str[3];
48     while(scanf("%d%*c",&n)!=EOF)
49     {
50         if(!n) break;
51         k = 0;
52         for(i = 1;i <= n;i ++)
53         o[i] = i;
54         for(i = 1; i <= n-1; i ++)
55         {
56             scanf("%s",str);
57             ss = str[0] - 'A' + 1;
58             scanf("%d%*c",&m);
59             for(j = 1; j <= m; j ++)
60             {
61                 scanf("%s%d%*c",str,&ww);
62                 vv = str[0] - 'A' + 1;
63                 p[k].sv = ss;
64                 p[k].ev = vv;
65                 p[k].w = ww;
66                 k ++;
67             }
68         }
69         qsort(p,k,sizeof(p[0]),cmp);
70         sum = 0;
71         num = 1;
72         for(i = 0; i <= k-1; i ++)
73         {
74             merge(p[i].sv,p[i].ev,p[i].w);
75             if(num == n)
76                 break;
77         }
78         printf("%d\n",sum);
79     }
80     return 0;
81 }
posted @ 2012-08-06 14:25  Naix_x  阅读(161)  评论(0编辑  收藏  举报