最小生成树问题一定是针对无向图,Kruskal算法适用于稀疏图
存储结构采用边结构体数组,n
为顶点数,m
为边数
struct edge {
int a, b, w;
}graph[m];
Kruskal算法需要借助并查集,流程如下:
(1)将所有边按照边权由小到大排序
bool cmp(edge e1, edge e2) {
return e1.w < e2.w;
}
sort(graph, graph+m, cmp);
(2)按权值增序遍历所有边,判断边的两个端点是否在一个集合中,如果不在则生成树选中这条边,将两个端点集合合并
for (int i = 0; i < m; i++) {
auto e = graph[i];
int x = find(e.a), y = find(e.b);
if (x != y) {
set[x] = y;
// 附加操作
}
}
注解:
(1)如果需要计算最小生成树边权和,则附加操作将所有选中边的graph[i].w
累加
(2)如果需要判断是否有最小生成树,则附加操作累计选中边数,如果最后累计边数为n-1
,则有最小生成树