前 言
求连通图的最小生成树,可以用Kruskal(克鲁斯卡尔)算法和Prim(普里姆)算法。本文介绍Kruskal算法的思路和实现。
思 路
Kruskal算法以边为基础,每次从集合中选择最小边,判断该边的两个端点是否属于同一个连通分量:若是,则跳过该边;反之,将两个端点合并连通分量,直到所有端点属于同一个连通分量,算法结束。
不难看出,我们需要使用并查集。
由于每次选择最小边,所以需要对所有边进行排序,设计如下的结构体,包含两个端点x、y以及权值len,即两点之间的距离
struct Edge {
int len; //权值
int x, y; //两个端点
Edge(int len, int x, int y) : len(len), x(x), y(y) {
}
};
实 现
根据算法思路,实现代码如下:
class Djset { //并查集模板
public:
vector parent;
vector rank;
int count;
Djset(int n): parent(vector(n)), rank(vector(n)), count(n) {
for (int i = 0; i < n; i++) parent[i] = i;
}
int find(int x) {
if (x != parent[x]) parent[x] =