📄 mincostree.cpp
字号:
//图的邻接矩阵表示,求最小生成树算法
#include "iostream.h"
#include "stdio.h"
#include "assert.h"
//#include "sqlist.h"
#include "minheap.h"
#include "USET.H"
//#include "minspantree.h"
#include "Graph.h"
const int MaxNumEdges = 50; //最大边数
//int DefaultSize = 100;
#ifndef SetMaxVertices
#define SetMaxVertices
const int MaxNumVertices=10; //最大顶点数
#endif
template <class NameType, class DistType>
MinSpanTree& Graph< NameType, DistType>::Kruskal ( MinSpanTree &T ) { //克鲁斯卡尔算法
MSTEdgeNode e;
MinHeap<MSTEdgeNode> H (CurrentEdges ); //最小堆
int NumVertices = VerticesList.Length(); //图中顶点个数
UFSets F (NumVertices); //连通分量
for ( int u=0; u<NumVertices; u++ ) //建立最小堆的数据
for ( int v=u+1; v<NumVertices; v++ )
if ( Edge[u][v] != 0 ) { //插入新边值结点到最小堆中
e.tail=u;e.head=v;e.key=Edge[u][v];
H.Insert (e);
}
int count = 1; //生成树边计数
while ( count < NumVertices ) { //反复执行, 取n-1条边
H.RemoveMin (e ); //从最小堆中退出具最小权值的边
int u = F.Find ( e.tail );
int v = F.Find ( e.head ); //取两顶点所在集合的根
if ( u != v ) { //不是同一集合, 说明不连通
F.Union ( u, v );
T.addEdge(e.tail,e.head,e.key);
count++; //合并, 连通它们, 该边加入生成树
}
}
return T;
}
void main()
{
Graph <char,int> g(10);
MinSpanTree T;
cin>>g;
g.DFS();
cout<<endl;
g.Kruskal(T);
cout<<T;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -