数据结构_图_最小生成树算法之Kruskal算法
最小生成树的经典算法,用到了树与等价的知识,具体参见严蔚敏数据结构P175具体内容。
head.h
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_VEX_NUM 20
#define MAX_EDGE_NUM MAX_VEX_NUM*MAX_VEX_NUM/2
class VexNode //顶点类记录一个顶点
{
public:
VexNode();
int father; //父节点位置
char name; //节点名字
int memnum; //当前节点所在集合中的元素个数
};
VexNode::VexNode()
{
father = -1;
memnum = 1;
}
class VexBox //顶点集合类
{
public:
VexBox();
VexNode vexbox[MAX_VEX_NUM];
int vexnum; //顶点数目
};
VexBox::VexBox()
{
vexnum = 0;
}
class EdgeNode //边节点类
{
public:
EdgeNode();
int vexnum1; //边连接的两个顶点的编号
int vexnum2;
int weight; //边的权重
};
EdgeNode::EdgeNode()
{
weight = 0;
}
class EdgeBox //边的集合
{
public:
EdgeBox();
EdgeNode edgebox[MAX_EDGE_NUM];
int edgenum;
};
EdgeBox::EdgeBox()
{
edgenum = 0;
}
class Kruskal //Kruskal算法实现类
{
public:
void GetKruskal(); //接口函数
private:
void GetVex(); //得到顶点信息
void GetEdge(); //得到边的信息
void BuildTree(); //建立生成树
int GetRoot(int); //得到以树表示的集合的根节点
VexBox v;
EdgeBox e;
};
void Kruskal::GetKruskal() //接口函数
{
GetVex(); //得到顶点信息
GetEdge(); //得到边的信息
BuildTree();
; //建立生成树
}
void Kruskal::GetVex() //得到顶点信息
{
cout << "Please Input Vertexes Of Graph :" << endl << endl;
char name;
while (cin >> name)
{
v.vexbox[v.vexnum++].name = name;
}
cin.clear();
}
bool Cmp(EdgeNode e1, EdgeNode e2)
{
if (e1.weight < e2.weight)
return true;
else
return false;
}
void Kruskal::GetEdge() //得到边的信息
{
cout << "Please Input Edges Of Graph :" << endl << "vexnum1 vexnum2 weight"
<< endl << endl;
int vexnum1, vexnum2, weight;
while (cin >> vexnum1 >> vexnum2 >> weight)
{
e.edgebox[e.edgenum].vexnum1 = vexnum1;
e.edgebox[e.edgenum].vexnum2 = vexnum2;
e.edgebox[e.edgenum].weight = weight;
e.edgenum++;
}
cin.clear();
sort(e.edgebox, e.edgebox + e.edgenum, Cmp);
}
int Kruskal::GetRoot(int i) //得到以树表示的集合的根节点
{
if (v.vexbox[i].father == -1)
return i;
else
return GetRoot(v.vexbox[i].father);
}
void Kruskal::BuildTree() //建立生成树
{
int root1, root2;
for (int i = 0; i < e.edgenum; i++)
{
if ((root1 = GetRoot(e.edgebox[i].vexnum1))
!= (root2 = GetRoot(e.edgebox[i].vexnum2)))
{
cout << v.vexbox[e.edgebox[i].vexnum1].name << "<-->"
<< v.vexbox[e.edgebox[i].vexnum2].name << endl;
if (v.vexbox[root1].memnum < v.vexbox[root2].memnum)
{
v.vexbox[root1].father = root2;
v.vexbox[root2].memnum += v.vexbox[root1].memnum;
}
else
{
v.vexbox[root2].father = root1;
v.vexbox[root1].memnum += v.vexbox[root2].memnum;
}
if (v.vexbox[root2].memnum == v.vexnum)
return;
}
}
cout << "Can't Build A Connected Graph !" << endl << endl;
}
main.cpp
#include"head.h"
int main()
{
Kruskal k;
k.GetKruskal();
system("pause");
}