思路
在原图中选择最小的边权,加其加入到生成树中,若此边在生成树中成环舍去。
代码实现
struct node {
int a, b, w;
bool operator<(node t)
{
return w < t.w;
}
} e[N];// 存边和权值
int find(int x) // 并查集路径压缩查找
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int kruskal()
{
sort(e, e + m); // 将各边的权值按从小到大排序
for (int i = 1; i <= n; i++) p[i] = i;
int cnt = 0, res = 0;
for (int i = 0; i < m; i++)
{
int a = e[i].a, b = e[i].b, w = e[i].w;
a = find(a), b = find(b);
if (a != b) // 防止成环 (在一个集合中才能成环)
{
p[a] = b; // 形成生成树
cnt++; // 统计生成树边数
res += w; // 统计生成树的权值
}
}
if (cnt == n - 1) return res;
else return false;
}