定义
Kruskal 算法
Kruskal算法是一种用于寻找有权无向图的最小生成树的贪心算法。核心是每次选取边权最小的边并确保边不会成环。
过程
对于一个无向连通图,设节点数量为,边集为,已经选取的边数为,边权和为。
- 排序:将边集按边权从小到大排序。
- 遍历:按边权从小到大取边,对于节点和,如果:
- 不在同一个并查集中:合并和的并查集(即连接和),,。
- 在同一个并查集中:跳过,防止成环。
- 结束:当时,算法完成。
实现
int N;
int n;
int f[N];
struct Edge
{
}
void init()
{
for(int i = 1; i <= n; i++)
f[i] = i;
}
int find(int i)
{
if(f[i] == i)
return f[i];
return f[i] = find(f[i]);
}
void unite(int x, int y)
{
int fx = find(x), fy = find(y);
f[fx] = fy;
}
void kruskal()
{
}