Kruskal算法
来源:互联网 发布:淘宝网哈伦裤女裤 编辑:程序博客网 时间:2024/06/07 07:48
Kruskal算法的基本思想是:
1 、对于图G=(V,E),开始时,将顶点集分为|V|个等价类,每个等价类包括一个顶点;
2、然后,以权的大小为顺序处理各条边,如果某条边连接两个不同等价类的顶点,则这条边被添加到MST,两个等价类被合并为一个;
3、反复执行此过程,直到只剩下一个等价类。
借用Hackbuteer1博客中的图片如下:
#include "GraphLink.h"#include "ParTree.h"#include "MinHeap.h"class Dist{public:int index; //顶点的索引值,仅Dijkstra算法会用到int length;//顶点之间的距离int pre;//路径最后经过的顶点bool operator < (const Dist &dist){return length < dist.length;}bool operator <= (const Dist &dist){return length <= dist.length;}bool operator > (const Dist &dist){return length > dist.length;}bool operator >= (const Dist &dist){return length >= dist.length;}bool operator == (const Dist &dist){return length == dist.length;}};void addEdgeToMST(Edge &edge,Edge* &MST,int n)// 将边e加到MST中{MST[n] = edge;}//最小支撑树的Kruskal算法,//参数G是图,参数MST是保存最小支撑树中所有边的数组void Kruskal(Graph& G, Edge* &MST) {ParTree<int> A(G.verticesNum());//等价类MinHeap<Edge> H(G.edgesNum());//最小值堆(minheap)MST = new Edge[G.edgesNum()-1];//最小支撑树int MSTTag = 0;//最小支撑树边的标号//将图的所有边插入最小值堆H中for(int i = 0; i < G.verticesNum();i++){for(Edge edge = G.firstEdge(i);G.isEdge(edge); edge = G.nextEdge(edge)){if(G.fromVertex(edge) < G.toVertex(edge))//因为是无向图,所以应防止重复插入{H.insert(edge);}}}int EquNum=G.verticesNum(); //开始时有|V|个等价类while(EquNum > 1){bool heapEmpty = H.isEmpty();Edge edge;if(!heapEmpty){H.removeMin(edge);//获得下一条权最小的边}if(heapEmpty || edge.weight == INFINITE){cout << "不存在最小支撑树." <<endl;delete [] MST; //释放空间MST=NULL; //MST是空数组return;}int from = G.fromVertex(edge);//记录该条边的信息int to = G.toVertex(edge);if(A.diffrent(from,to))//如果边e的两个顶点不在一个等价类{A.unionTree(from,to);//将边e的两个顶点所在的两个等价类合并为一个}addEdgeToMST(edge,MST,MSTTag++);//将边e加到MSTEquNum--;//将等价类的个数减1}}int A[N][N] = {// v0 v1 v2 v3 v4 v5 v6 0, 20, 0, 0, 1, 0, 0,20, 0, 6, 4, 0, 0, 0,0, 6, 0, 0, 0, 0, 2,0, 4, 0, 0, 0, 12, 8,1, 0, 0, 0, 0, 15, 0,0, 0, 0, 12, 15, 0, 10,0, 0, 2, 8, 0, 10, 0};int main(){GraphLink<ListUnit> graphLink(N); // 建立图 graphLink.initGraph(graphLink, A,N); // 初始化图Edge *D;Kruskal(graphLink,D);for (int i = 0; i < N - 1; i ++){cout << "V" << D[i].from << "->V" << D[i].to << " Weight is : " << D[i].weight << endl;}system("pause");return 0;}
0 0
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- kruskal算法
- kruskal算法
- kruskal算法
- Kruskal算法
- kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- Kruskal算法
- 纽约时报:2013年十大热门国内科技公司
- vmware下redhat使用bridged(桥接模式)访问互联网
- ICT实习第二周第一天
- Dreamweaver做ASP数据库的几个常见问题
- linux的bond技术
- Kruskal算法
- Camera 图像处理原理分析- 抗噪 变焦 频闪 等
- [MS SQL]常用SQL语句大全2-技巧
- JS正则表达式验证身份证号码
- 脱口秀:秒杀周立波郭德纲高晓松的香格里拉奇人!
- 自动安装并配置ODBC的思路与实现(自动创建MysqlDSN )
- Dreamweaver 8中CSS样式表的若干问题
- 妈妈对已出嫁的女儿的忠告
- android 4.3源码下载【自己下载成功的步骤、其中遇到很多你可能会遇到的很多问题】