数据结构_图_最小生成树算法之Kruskal算法

数据结构_图_最小生成树算法之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");
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注