数据结构_图_最小生成树算法之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");}
- 数据结构_图_最小生成树算法之Kruskal算法
- 数据结构_图_最小生成树算法之prime算法
- 数据结构之最小生成树 Kruskal算法
- 数据结构之图---最小生成树Kruskal算法---C++实现
- 求最小生成树_克鲁斯卡尔算法(Kruskal)
- 数据结构_图_prim最小生成树算法
- 蓝桥杯_算法提高_最小方差生成树(Kruskal算法)
- 图算法之最小生成树(Kruskal)
- 图之 最小生成树 Kruskal算法
- 数据结构(C实现)------- 最小生成树之Kruskal算法
- 数据结构:最小生成树--Kruskal算法
- 数据结构 最小生成树 Kruskal算法
- 数据结构:最小生成树--Kruskal算法
- 【算法和数据结构】1.10--图的最小生成树之Kruskal算法(C++实现)
- 算法学习之图的最小生成树Kruskal算法
- 图之最小生成树-Prim算法和Kruskal算法
- 图算法:最小生成树算法之KrusKal
- 数据结构之(图之最小生成树)Kruskal(克鲁斯卡尔)算法
- UC故事 2011/10/09
- SNMP报文分析
- hadoop interview questions
- Xcode快捷键
- 删除两个双向循环链表中具有相同值的节点
- 数据结构_图_最小生成树算法之Kruskal算法
- 面试时问题
- mysqldumpslow和mysqlsla分析mysql慢查询日志
- 初级软件开发工程师:养成良好的编码习惯
- Android学习六之Service(二)
- Android再按一次后退键退出
- ebay and hadoop
- web service for java
- 第六课学习