最小生成树
来源:互联网 发布:网络售后服务包括 编辑:程序博客网 时间:2024/06/05 00:15
一颗带权无向图的生成树的代价是该生成树中所有边的代价之和,最小代价生成树就是一颗代价最小的生成树,构建无向图的最小生成树就是采用贪心算法,不过对于最小生成树问题,需满足以下约束条件:
- 只能使用图中的边
- 只能使用恰好n-1条边
- 不能使用产生环路的边
Kruskal算法通过每次向当前最小代价生成树T中加入一条边的方法构成最终的最小生成树T,算法按照边的代价非递减的顺序选取,并加入T中,如果所选取的边与T中的边不形成环路,则这条边加入到T中,由于图G是连通的,且具有n个顶点,所以最终恰好选取n-1条边加入到T中。
如图所示:
为了实现Kruskal算法,必须找出最小代价的边并将其从E中删除,如果把E中的边按权值进行排序,保存为一个顺序表,就可以有效的完成上述两个操作,但实际上,只要能够快速地找到下一条边最小代价的边,就没有要对E中的边进行排序,显然最小堆非常适合这个任务,因为最小堆可以在O(loge)时间内找出并删除下一条最小权值的边,而构造最小堆本身的时间复杂性为O(e).
伪代码实现:
//最小生成树算法void create minTree(){ T={};//最小生成树的集合 //T的边数需小于n-1,却无向图的边不能为空 while(T.edgesCount<n-1&&E.edgesCount>0) { minHeap(v,w,E);//从无向图E集合选择最小代价的边 delete(v,w,E);//删除该边 //如果新加入边不构成环,则加入,否则丢弃 if(!isCycle(v,w,T)) { add(v,w,T) } else { discard(v,w) } } //检查最小生成树的边数是否满足约束条件 if(T.egdescount!=n-1) { printf("No spanning tree\n"); }}
0 0
- 最小比例 最小生成树
- 最小生成树&&次最小生成树
- 最小生成生成树计数
- 树+最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树问题
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- NOIp 2006 能量项链
- Hibernate-映射关系- 基于外键映射的1<->1映射
- 技术人生“白天求生存,晚上谋发展”
- 运行报错:查询块具有不正确的结果列数
- 判断一个数是不是2的幕
- 最小生成树
- iPhone屏幕投射到Mac的解决方案
- hiho 2 Trie树
- iOS Swift混编详解
- 五大常用算法详解—转
- 调试临时日志输出
- logback配置文件
- 设计模式中类的关系
- [sicily]1500. Prime Gap