图论——最小生成树——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; } }