无向图的最小连通分量——Kruskal算法
此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。
- 把图中的所有边按代价从小到大排序;
- 把图中的n个顶点看成独立的n棵树组成的森林;
- 按权值从小到大选择边,所选的边连接的两个顶点,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。
- 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。
参考文章图解:什么是最小生成树?
vector<int> parents;
int count;
void init(int n){
count = n+1;
parents = vector<int>(n+1, 0);
for(int i=0; i<=n; ++i){
parents[i] = i;
}
}
int find(int x){
if(x != parents[x])
return find(parents[x]);
return parents[x];
}
void Union(int x, int y){
int rootX = find(x);
int rootY =<