最小生成树 Kruskal算法

 1 int n;
 2 int p[MAXN],r[MAXN],u[MAXN],v[MAXN],w[MAXN];
 3 int cmp(const int i,const int j) {
 4     return w[i] < w[j];
 5 }
 6 int find(int x) {
 7     return p[x] == x ? x : p[x] = find(p[x]);
 8 }
 9 int kruskal() {
10     int ans = 0;
11     for(int i = 0;i < n;i ++) p[i] = i;
12     for(int i = 0;i < n;i ++) r[i] = i;
13     sort(r,r + n,cmp);
14     for(int i = 0;i < n;i ++) {
15         int e = r[i];
16         int x = find(u[e]);
17         int y = find(v[e]);
18         if(x != y) {
19             ans = max(ans,w[e]);
20             p[x] = y;
21         }
22     }
23     return ans;
24 }

 

posted @ 2015-03-26 20:57  Mite  阅读(130)  评论(0)    收藏  举报