图论——最小生成树——Kruskal算法
最小生成树的基础算法比最短路的简单114514倍
前面说了一个适用于稠密图的算法,这次来说一说一个适用于稀疏图的最小生成树算法——Kruskal算法,老土话叫克鲁斯卡尔算法。
同样,它的实现也很简单,还是经典三步:
1、将所有边按从小到大顺序排序(啊哈哈,终于不是初始化了)。
2、枚举每条边,设a已经确定(在最小生成树的集合中),b是与a相连的边,权值是c。
3、判断,如果a,b不连通,将b加到集合中。
完了。
最后,考虑时间复杂度:排序时间复杂度为O(m*log2m),枚举时间复杂度为O(m),忽略常数就是O(m*log2m)。
模板代码,这里用的是类似于并查集的方式:
int find(int x) {
if(p[x]!=x) p[x]=find(p[x]);
else return x;
}
int res=0,cnt=0;
for(int i=1; i<=m; i++) {
int a=edges[i].a,b=edges[i].b,w=edges[i].w;
if(find(a)!=find(b)) {
p[find(a)]=p[find(b)];
cnt++;
res+=w;
}
}

浙公网安备 33010602011771号