zrq495
www.zrq495.com

最小生成树.

Kruskal 算法

代码:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 
 5 using namespace std;
 6 
 7 typedef struct
 8 {
 9     int a, b;
10     int d;
11     int flag;
12 }node;
13 
14 int set[102];
15 node w[5002];
16 
17 int cmp(const void *a, const void *b)
18 {
19     node *pa=(node *)a;
20     node *pb=(node *)b;
21     return pa->d - pb->d;
22 }
23 
24 int find(int n)
25 {
26     int k, r, j;
27     r=n;
28     while(r != set[r])
29         r=set[r];
30     k=n;
31     while (k != r)
32     {
33         j=set[k];
34         set[k]=r;
35         k=j;
36     }
37     return r;
38 }
39 
40 int merge(int a, int b)
41 {
42     int x=find(a);
43     int y=find(b);
44     if (x == y)
45         return 0;
46     set[x]=y;
47     return 1;
48 }
49 
50 int main()
51 {
52     int n, i;
53     int sum, cnt;
54     while(scanf("%d", &n) && n)
55     {
56         for (i=1; i<=n; i++)
57             set[i]=i;
58         cnt=1;
59         for (i=0; i<n*(n-1)/2; i++)
60         {
61             scanf("%d%d%d%d", &w[i].a, &w[i].b, &w[i].d, &w[i].flag);
62             if (w[i].flag == 1)
63             {
64                 set[w[i].a]=w[i].b;
65                 cnt++;
66             }
67         }
68         qsort(w, n*(n-1)/2, sizeof(w[0]), cmp);
69         sum=0;
70         for (i=0; cnt<n; i++)
71         {
72             if (merge(w[i].a, w[i].b))
73             {
74                 cnt++;
75                 sum+=w[i].d;
76             }
77         }
78         printf("%d\n", sum);
79     }
80     return 0;
81 }
posted on 2012-08-06 20:08  zrq495  阅读(106)  评论(0编辑  收藏  举报