1.问题
在一个连通无向图G=(V, E)中,对于其中的每条边(u,v)∈E,赋予其权重w(u, v),若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的最小生成树。
2.解析
以上图为例具体计算步骤如下:
3.设计
for (int i = 1; i <= m; i++)
{
int u = edge[i].u, v = edge[i].v, w = edge[i].w;
if (Find(u) != Find(v)) //判断是否在同一棵树上
{
father[Find(u)] = Find(v);
ans += w;
cnt++;
res[cnt].u = u; res[cnt].v = v; res[cnt].w = w; //合并集合
}
}
4.源码
https://github.com/Wang-2333/Kruskal/blob/master/Kruskal/Kruskal.cpp