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


你可能感兴趣的:(数据结构,算法,System,Class,Graph,input)