每次试图加入一条边,所以要定义边的结构体。
三步走:
- 初始化。
- 遍历所有边,选择未并入的且并入不产生环的最短边并入。并入n-1条边时停止。
- 返回不连通或最小生成树权值和。
//kruskal
struct edge {
int u, v;
int cost;
}e[maxn];
bool cmp(edge a, edge b) {
return a.cost < b.cost;
}
bool vis[maxn] = { false };
int d[maxn], n, father[maxn];
int findfather(int x) {
while (x != father[x])
x = father[x];
return x;
}
int kruskal(int n,int m) {//n个顶点,m条边
//1
int sum_weight = 0, sum_edge = 0;
for (int i = 1; i <= n; i++)
father[i] = i;//并查集数组初始化
sort(e, e + m, cmp);
//2
for (int i = 0; i < m; i++) {
int father_u = findfather(e[i].u);
int father_v = findfather(e[i].v);
if (father_u != father_v) {
father[father_u] = father_v;
//3
sum_weight+= e[i].cost;
sum_edge++;
if (sum_edge == n - 1)
break;//边数等于n-1时,生成树已生成
}
}
//4
if (sum_edge != n - 1)
return -1;//说明不连通
return sum_weight;
}