首页 > 代码库 > 算法与数据结构--图的实现、基本操作及应用
算法与数据结构--图的实现、基本操作及应用
#include<iostream> #include<queue> #include<stack> using namespace std; #define INFINITY DBL_MAX //无穷大 #define MAX_VERTEX_NUM 20 //最大顶点个数 enum GraphKind //图的类型 { DG,DN,UDG,UDN//有向图、有向网、无向图、无向网 }; //弧结构 typedef struct ArcCell { double adj;//权值,无权图用1表示 }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵图结构 struct MGraph { int vexs[MAX_VERTEX_NUM];//顶点集合 AdjMatrix arecs;//邻接矩阵 int vexnum,arcnum;//顶点数、弧数 GraphKind kind;//图的类型 }; //表节点 struct ArcNode { int adjvex;//弧的顶点位置 ArcNode * nextarc; double adj;//弧的权值 }; //头节点 typedef struct VNode { int data;//顶点序号信息 ArcNode * firstarc; }AdjList[MAX_VERTEX_NUM]; //邻接表 struct ALGraph { int vexs[MAX_VERTEX_NUM];//顶点集合 AdjList vertices; //邻接链表 int vexnum,arcnum;//顶点数、弧数 int kind;//图的类型 }; //显示主菜单 void ShowMainMenu() { cout<<"\n"; cout<<" ***************图的基本操作及应用******************\n"; cout<<" * 1 无向图的基本操作及应用 *\n"; cout<<" * 2 有向图的基本操作及应用 *\n"; cout<<" * 3 无向网的基本操作及应用 *\n"; cout<<" * 4 有向网的基本操作及应用 *\n"; cout<<" * 5 退出 *\n"; cout<<" ***************************************************\n"; } /* *无向图的函数集 */ //创建无向图的邻接矩阵 bool CreatUDG_M(MGraph & MG) { MG.kind = UDG; cout<<"请输入该无向图的顶点个数、弧的条数:"<<endl; cin>>MG.vexnum>>MG.arcnum; //初始化顶点集合 cout<<"依次输入顶点序号"<<endl; for(int i = 0;i<MG.vexnum;i++) cin>>MG.vexs[i]; //初始化邻接矩阵 for(int i = 0;i<MG.vexnum;i++) { for(int j = 0;j<MG.vexnum;j++) { MG.arecs[i][j].adj = INFINITY; } } //构造邻接矩阵 for(int i = 0;i<MG.arcnum;i++) { int v1,v2; cout<<"依次输入弧的两个顶点序号:"<<endl; cin>>v1>>v2; int *p1 = find(MG.vexs,MG.vexs+MG.vexnum,v1); int *p2 = find(MG.vexs,MG.vexs+MG.vexnum,v2); if(p1==MG.vexs+MG.vexnum||p2==MG.vexs+MG.vexnum) return false; MG.arecs[(p1-MG.vexs)][(p2-MG.vexs)].adj = 1; //无向图的邻接矩阵是对称矩阵 MG.arecs[(p2-MG.vexs)][(p1-MG.vexs)].adj = 1; } //输出该邻接矩阵 cout<<"该邻接矩阵为(-1代表无穷大):"<<endl; for(int i = 0;i<MG.vexnum;i++) { for(int j = 0;j<MG.vexnum;j++) { if(MG.arecs[i][j].adj==INFINITY) cout<<"∞ "; else { cout<<MG.arecs[i][j].adj<<" "; } } cout<<endl; } return true; } //创建无向图的邻接表 bool CreatUDG_ALG(ALGraph & ALG) { ALG.kind = UDG; cout<<"请输入该无向图的顶点个数、弧的条数:"<<endl; cin>>ALG.vexnum>>ALG.arcnum; //初始化顶点集合 cout<<"依次输入顶点序号"<<endl; for(int i = 0;i<ALG.vexnum;i++) cin>>ALG.vexs[i]; //构造邻接表 for(int i = 0;i<ALG.vexnum;i++) { //初始化头结点的data信息 ALG.vertices[i].data = http://www.mamicode.com/ALG.vexs[i];>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。