图论——最小生成树

最小生成树算法

Kruskal+并查集

O(ElogE)

 1 const int maxe = 10000;
 2 int u[maxe], v[maxe], w[maxe],fa[maxe],r[maxe];
 3 int n, m;
 4 
 5 //间接排序函数
 6 int cmp(const int i, const int j)
 7 {
 8     return w[i] < w[j];
 9 }        
10 int find(int x)
11 {
12     if (fa[x] != x)  return fa[x] = find(fa[x]);
13     return fa[x];
14 }
15 int Kruskal()
16 {
17     int ans = 0;
18     for (int i = 0; i < n; i++)  fa[i] = i;        //初始化并查集
19     for (int i = 0; i < m; i++)     r[i] = i;        //初始化边序列
20     sort(r, r + m, cmp);
21     for (int i = 0; i < m; i++)
22     {
23         int e = r[i]; int x = find(u[e]); int y = find(v[e]);
24         if (x != y)                //如果不在同一集合,合并
25         {
26             ans += w[e];
27             fa[x] = y;
28         }
29     }
30     return ans;
31 }

 

posted @ 2018-08-27 21:23  Rogn  阅读(232)  评论(0编辑  收藏  举报