Kruskal最小生成树算法
来源:互联网 发布:淘宝长尾词是什么意思 编辑:程序博客网 时间:2024/06/04 19:33
Kruskal是通过一个贪心的想法:每次取剩下的边权最小的边,如果加上这条边以后图中出现了一个环(这个可以通过并查集维护),则破坏了生成树的性质,就不选这条边。依次进行直到整张图出现一棵生成树为止。
下面为Kruskal算法代码:
#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int maxn = 1001;int fa[maxn];int N,M;struct edge{ int x,y,w; edge(int x = 0,int y = 0,int w = 0):x(x),y(y),w(w) {}}e[maxn];bool cmp(edge a,edge b){ return a.w < b.w;}int getfather(int x){ if(x == fa[x]) { return x; } else { return fa[x] = getfather(fa[x]); }}int kruskal(){ int ans; sort(e+1,e+M+1,cmp); //对边按从小到大排序 int cnt = N; for(int i=1;i<=N;i++) fa[i] = i; //初始化并查集 for(int i=1;i<=M;i++) { int t1 = getfather(e[i].x); int t2 = getfather(e[i].y); if(t1 != t2) { fa[t1] = t2; cnt--; ans += e[i].w; cout<<"edge1:"<<e[i].x<<" "<<"edge2:"<<e[i].y<<" "<<"ans:"<<ans<<endl; if(cnt == 1) break; //若只剩一个连通块,即最小生成树已经得出,则退出 } } return ans;}int main(){ int answer; freopen("111","r",stdin); cin>>N>>M; for(int i=1;i<=M;i++) { cin>>e[i].x>>e[i].y>>e[i].w; } answer = kruskal(); cout<<"minimal answer:"<<answer<<endl; return 0;}
0 0
- Kruskal 最小生成树算法
- 最小生成树Kruskal算法
- 最小生成树----Kruskal算法
- 最小生成树kruskal算法
- 最小生成树 - Kruskal算法
- 最小生成树---Kruskal算法
- 最小生成树(kruskal算法)
- 最小生成树,kruskal算法
- 最小生成树--kruskal算法
- 最小生成树---kruskal算法
- 最小生成树--Kruskal算法
- 最小生成树 : Kruskal 算法
- 最小生成树-Kruskal算法
- 最小生成树 Kruskal算法
- 最小生成树kruskal算法
- 最小生成树kruskal算法
- 【Kruskal】算法 最小生成树
- 最小生成树kruskal算法
- C语言BNF范式
- uva 10815 set的用法
- c中malloc calloc realloc 的区别和联系
- 乱码的艺术
- IO 相关指标
- Kruskal最小生成树算法
- rockethon2015 B题 Permutations 规律+构造
- Scala ListBuffer使用备忘
- Apache Storm提交Topology时的默认CLASSPATH问题
- ClassNotFoundException when unmarshalling 问题总结
- Hibernate自动生成实体类注解
- Oracle 11.2.0.1在xp上的静默(slient)安装
- android学习笔记(一)数据存储与访问
- 微信企业号终于来了 第一时间带你体验真面目