图论——最小生成树
最小生成树算法
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 }
个性签名:时间会解决一切