intGetRoot(int parent[], int i) { while (i != parent[i]) { i = parent[i]; } return i; }
/// <summary> /// 用Kruskal算法计算最小生成树的权值和 /// </summary> /// <param name="edges">图的所有边</param> /// <param name="n">图的顶点数</param> /// <param name="e">图的边数</param> /// <param name="sum">最小生成树的权值和</param> voidKruskal(Edge edges[], int n, int e, int& sum) { int a, int b; int* parent = newint[n]; sum = 0; for (int i = 0; i < n; i++) { parent[i] = i; // 只有一个结点,自己就是树根 } Sort(edges, e); // 将所有边按找权值递增排序 for (int i = 0; i < e; i++) { a = GetRoot(parent, edges[i].a); // a所在的树根 b = GetRoot(parent, edges[i].b); // b所在的树根 if (a != b) { parent[a] = b; // 把树a挂到b上,作为b的子树 sum += edges[i].w; Print(edges[i].a, edges[i].b); } } }