[最小生成树]Kruskal算法
2015-08-10 15:56
281 查看
接下来看一下Kruskal算法:
Kruskal需要用到并查集,所以编码的复杂度相比prim算法要高一些。该算法按照边的权值顺序从小到大查看一遍,如果不产生圈,就把当前这条边加入到生成树中。kruskal返回的是整棵最小生成树的总权值。
举个例子:
![](https://img-blog.csdn.net/20150810154220915)
接下来我们介绍如何判断是否产生圈。假设现在要把连接顶点u和顶点v的边e加入生成树中。如果加入之前,u和v不在同一个连通分量里,那么加入e也不会产生圈,反之,如果u和v在同一个连通分量里,那么一定会产生圈。可以使用并查集高效地判断是否属于同一个连通分量。
Kruskal算法在边的排序上最费时,算法的复杂度是O(ElogV)。
Kruskal需要用到并查集,所以编码的复杂度相比prim算法要高一些。该算法按照边的权值顺序从小到大查看一遍,如果不产生圈,就把当前这条边加入到生成树中。kruskal返回的是整棵最小生成树的总权值。
举个例子:
接下来我们介绍如何判断是否产生圈。假设现在要把连接顶点u和顶点v的边e加入生成树中。如果加入之前,u和v不在同一个连通分量里,那么加入e也不会产生圈,反之,如果u和v在同一个连通分量里,那么一定会产生圈。可以使用并查集高效地判断是否属于同一个连通分量。
Kruskal算法在边的排序上最费时,算法的复杂度是O(ElogV)。
struct edge{int u,v,cost;} bool cmp(const node& e1,const node& e2) { return e1.cost < e2.cost; } edge G[MAXE];//边 int V,E;//顶点数,边数 //这里省略了并查集的Find(),init()和unit() //需要自己补上 int kruskal() { sort(G,G+E,cmp); init_union(V); //初始化并查集 int res = 0; for(int i = 0 ; i < E;i++) { edge e = G[i]; if(Find(e.u) != Find(e.v)) { unite(e.u,e.v); res += e.cost; } } return res; }
相关文章推荐
- 帮助理解angularjs的scope(笔记mark)
- file,bitmap工具类
- 机房收费系统之动态下机功能
- hdu 1711Number Sequence (KMP入门,子串第一次出现的位置)
- 关于SoCFPGA 编译问答
- ASP.NET中IsPostBack详解(转载)
- POJ 2195 Going Home(BFS+KM求最小权值)
- C/C++中字符串与数字之间的转换
- CCMenuItemSprite ---CCMenuItemImage::create无法显示全部菜单项的解决办法![待续]
- CRLF Injection漏洞的利用与实例分析
- popen()
- 注册mysql为系统服务and命令行启动
- 线段树(二)区间更新补充
- zoj 1002 Fire Net【DFS】
- Linux Socket编程(不限Linux)
- Android开发环境搭建
- Linux信号通讯编程
- android增量升级
- Amazon Dynamo架构分析(一)
- Oracle存储过程单步调试方法