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