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

来源:互联网 发布:美国非农数据统计表 编辑:程序博客网 时间:2024/05/06 09:01

最小生成树的经典算法,用到了树与等价的知识,具体参见严蔚敏数据结构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/2class 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;elsereturn 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;elsereturn 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");}


原创粉丝点击