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 }

你可能感兴趣的:(最小生成树)