4旅游区导游图7人

#includestdio.h#includemalloc.h#includestring.h#include<iostream.h>#define INFINITY 32767 /* 最大值∞ */ /* 根据图的权值类型,分别定义为最大整数或实数 */#define MAX_VEX 30 /* 最大顶点数目 */typedef enum {FALSE , TRUE} BOOLEAN ;typedef struct MGraph{ char vexs[MAX_VEX]; int arcs[MAX_VEX][MAX_VEX]; int vexnum,arcnum;}MGraph;/*图的邻接链表表示结构有关定义*/typedef struct Linknode{ char adjvex; /*邻接点在头结点数组中的位置(下标)*/ int info; /*与边或弧相关的信息, 如权值*/ struct Linknode *nextarc; /*指向下一个表结点*/}LinkNode; /* 表结点类型定义 */typedef struct VexNode{ char data; /*顶点信息*/ LinkNode *firstarc; /*指向第一个表结点*/}VexNode; /* 顶点结点类型定义 */typedef struct { int vex1, vex2; /* 弧或边所依附的两个顶点 */ int info; /*与边或弧相关的信息, 如权值*/}ArcType; /* 弧或边的结构定义 */typedef struct{ int vexnum; VexNode AdjList[MAX_VEX];}ALGraph; /* 图的结构定义 */ //////////////////////////////////////////////////////////////////////////////////////////// /* 图的邻接链表表示 */void Init_Graph(ALGraph * G){ /*图的初始化*/ printf(旅游区导游图的类型:带权无向图); G->vexnum=0; /* 初始化顶点个数 */}int LocateVex(ALGraph *G, char vp) { /*图的顶点定位*/ int k; for(k=0; k<G->vexnum;k++) if(G->AdjList[k].data==vp) return(k); return(-1); /* 图中无此顶点 */}int AddVertex(ALGraph *G, char vp){ if (G->vexnum>=MAX_VEX) { printf(图中顶点数已达到最多!\n); return(-1); } if(LocateVex(G,vp)!=-1) { printf(所要添加的顶点已存在!\n); return(-1); } G->AdjList[G->vexnum].data=vp; G->AdjList[G->vexnum].firstarc=NULL; ++G->vexnum; return 1; }int AddArc(ALGraph *G, ArcType *arc){ /*向图中增加一条边(弧)*/ int k,j; LinkNode *p,*q; k=LocateVex(G,arc->vex1); j=LocateVex(G,arc->vex2); if (k==-1||j==-1) { printf(该两个景点之间一点 或 两点都不存在,错误 !\n); ////// return(-1); } p=(LinkNode *)malloc(sizeof(LinkNode)); p->adjvex=arc->vex1; p->info=arc->info; p->nextarc=NULL; /* 边的起始表结点赋值 */ q=(LinkNode *)malloc(sizeof(LinkNode)); q->adjvex=arc->vex2; q->info=arc->info; q->nextarc=NULL; /* 边的末尾表结点赋值 */ q->nextarc=G->AdjList[k].firstarc; G->AdjList[k].firstarc=q; p->nextarc=G->AdjList[j].firstarc; G->AdjList[j].firstarc=p ; return(1);}ALGraph *Create_ALGraph(){ /*采用邻接链表作为图的存储结构建立带权有向图*/ char stack1[6],stack2[6],vex,k1,k2; int weight; ALGraph *G; ArcType *p; printf(首先对旅游区导游图进行初始化!!!\n\n); G=(ALGraph *)malloc(sizeof(ALGraph)); Init_Graph(G); printf(\n请输入旅游区导游图的各个旅游景点代码(只允许是字符,不为字符串),0作为结束标志\n); while(1) { scanf(%s,stack1); vex=stack1[0]; if(vex=='0') break; else AddVertex(G,vex); } p=(ArcType *)malloc(sizeof(ArcType)); printf(\n 以(Vi ,Vj ,d)的形式从键盘输入建立该旅游区的旅游景点图,\n 其中: Vi和Vj表示两个不同的旅游景点, d表示这两个景点之间的道路距离;\n 该旅游景点图采用邻接链表存储结构(第一个顶点是0时表示结束):\n); while(1) { scanf(%s,stack1); k1=stack1[0]; if (k1=='0') /* 输入第一个顶点,0结束 */ break; else { scanf(%s,stack2) ; scanf(%d,&weight) ; /* 输入第二个顶点和权值 */ k2=stack2[0]; p->vex1=k1; p->vex2=k2; p->info=weight; AddArc(G,p) ; printf(\n请继续输入下一条道路!!\n) ; } } return(G);}void output_ALGraph(ALGraph *G){ /* 输出图的邻接链表 */ int j; LinkNode *p; printf(\n旅游区导游图的邻接链表表示如下:\n); for (j=0;j<G-> vexnum;j++) { printf(%c,G->AdjList[j].data); p=G->AdjList[j].firstarc; while(p!=NULL) { printf(->); printf(<%c,%d>,p->adjvex,p->info); p=p->nextarc; } printf(\n\n); } }void output_Find_ALGraph(ALGraph *G){ /* 相邻景点查询并输出 */ int j; LinkNode *p; printf(请输入你要查询的景点(下标值):\n); scanf(%d,&j); p=G->AdjList[j].firstarc; while(p) { printf(景点%c到景点%c的距离是%d (该两个景点之间有直接的道路相通)\n,G->AdjList[j].data,p->adjvex,p->info); p=p->nextarc; } printf(\n\n); }void ListToMat(ALGraph G, MGraph &g){ /*将邻接链表转换成邻接矩阵*/ int k,i,j,n=G.vexnum; LinkNode *p; for (i=0;i<n;i++) /*g.arcs[i][j]赋初值0*/ for (j=0;j<n;j++) g.arcs[i][j]=INFINITY; for(i=0;i<G.vexnum;i++) { g.vexs[i]=G.AdjList[i].data; } for (i=0;i<n;i++) { p=G. AdjList[i].firstarc; while (p!=NULL) { k=LocateVex(&G,p->adjvex); g.arcs[i][k]=p->info; p=p->nextarc; } } g.vexnum=G.vexnum;} void display(ALGraph *G,MGraph g){ //输出邻接矩阵 int i,j; ListToMat(*G, g); for(i=0;i<G->vexnum;i++) printf(%6c,G->AdjList[i].data ); printf(\n); for(i=0;i<g.vexnum;i++) { for(j=0 ;j<g.vexnum ;j++) { printf(%6d, g.arcs[i][j]); } printf(\n); }}void dijkshort_One(ALGraph F, MGraph G,int v0,int distance[], int pre[]){ // 带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标pre int w; int S[30],i,j,k,p,min; ListToMat(F, G); printf(你所要开始查询的景点是:%c\n,F.AdjList[v0].data); for(i=0;i<G.vexnum;i++) { distance[i]=G.arcs[v0][i]; S[i]=0; if(distance[i]<32767) pre[i]=v0; else pre[i]=-1; } S[v0]=1; //顶点v0已加入到集合S中 for(i=0;i<G.vexnum;i++) { min=32767; for(j=0;j<G.vexnum;j++) { if(!S[j]&&distance[j]<min) { min=distance[j]; k=j; } } S[k]=1; ///将找到的顶点加入到集合S中 for(w=0;w<G.vexnum;w++) // /修改集合T中顶点的距离值 if(!S[w]&&distance[w]>distance[k]+G.arcs[k][w]) { distance[w]=distance[k]+G.arcs[k][w]; pre[w]=k; } } printf(查询结果:\n); for(j=0;j<G.vexnum;j++) //输出结果 if(pre[j]!=-1) { printf(从景点%c到景点%c,F.AdjList[v0].data,G.vexs[j]); p=pre[j]; printf(的最短距离是: %d,distance[j]); printf( 途中经过的景点有:); while(p!=-1) { printf( %c,G.vexs[p]); p=pre[p]; } printf(\n); } else if(j!=v0) printf(\n%c到%c : no path,G.vexs[j],G.vexs[v0]);}void dijkshort_Two(ALGraph F, MGraph G,int v0,int distance[], int pre[]){ // 带权图G从顶点v0到其他定点的最短距离distance和最短路径前驱结点的下标pre int w; int S[30],i,j,k,p,min,d; ListToMat(F, G); printf(你所要开始查询的开始景点是:%c\n\n,F.AdjList[v0].data); for(i=0;i<G.vexnum;i++) { distance[i]=G.arcs[v0][i]; S[i]=0; if(distance[i]<32767) pre[i]=v0; else pre[i]=-1; } S[v0]=1; //顶点v0已加入到集合S中 for(i=0;i<G.vexnum;i++) { min=32767; for(j=0;j<G.vexnum;j++) { if(!S[j]&&distance[j]<min) { min=distance[j]; k=j; } } S[k]=1; ///将找到的顶点加入到集合S中 for(w=0;w<G.vexnum;w++) // /修改集合T中顶点的距离值 if(!S[w]&&distance[w]>distance[k]+G.arcs[k][w]) { distance[w]=distance[k]+G.arcs[k][w]; pre[w]=k; } } printf(输入你要查询的另外一个景点(下标值):); scanf(%d,&d); printf(你要查询的另外一个景点是:%c\n,G.vexs[d]); printf(\n查询结果:\n); //输出结果 if(pre[d]!=-1) { printf(从景点%c到景点%c,F.AdjList[v0].data,G.vexs[d]); p=pre[d]; printf(的最短距离是: %d,distance[d]); printf( 途中经过的景点有:); while(p!=-1) { printf( %c,G.vexs[p]); p=pre[p]; } printf(\n); }}/////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// /* ------------菜单------------*/void main(){ int n,v0; MGraph g; int distance[MAX_VEX],pre[2*MAX_VEX]; ALGraph *G; printf(┏┉┉┉┉┉┉┉┉┉┉┉┉┓\n); printf(┋ 欢迎使用旅游区导游系统 ┋\n); printf(┗┉┉┉┉┉┉┉┉┉┉┉┉┛\n);do { printf(\n请选择对旅游区导游图的操作:\n\n); printf( ┏━━━━━━━━━━━━━━━━━━━━━┓\n); printf( ┃ 1.建立旅游区导游图的邻接链表 ┃\n); printf( ┃ 2.旅游区导游图的邻接链表的输出 ┃\n); printf( ┃ 3.旅游区导游图的邻接矩阵的输出 ┃\n); printf( ┃ 4.相邻景点查询 ┃\n); printf( ┃ 5.景点路线查询 ┃\n); printf( ┃ 6.景点路线综合查询 ┃\n); printf( ┃ 7.退出操作 ┃\n); printf( ┗━━━━━━━━━━━━━━━━━━━━━┛\n); do { scanf(%d,&n); } while (n<1||n>8); switch(n) { case 1: { G=(ALGraph *)malloc(sizeof(ALGraph)); G=Create_ALGraph(); printf(\n\n); break; } case 2: { printf(\n旅游导游图的邻接链表表示如下所示:\n); output_ALGraph(G); printf(\n\n); break; } case 3: { printf(\n旅游区导游图的邻接矩阵表示如下所示:\n); display(G,g); printf(\n\n); break; } case 4: { output_Find_ALGraph(G); printf(\n\n); break; } case 5: { printf(输入你要查询的景点(下标值):); scanf( %d,&v0); dijkshort_One(*G,g,v0,distance,pre); break; } case 6: { printf(输入你要查询的开始景点(下标值):); scanf( %d,&v0); dijkshort_Two(*G,g,v0,distance,pre); break; } } } while(n!=7);}

Hash:248dcbd45417f5d7292f66d40f4889d788fd2908

声明:此文由 飞舞九天 分享发布,并不意味本站赞同其观点,文章内容仅供参考。此文如侵犯到您的合法权益,请联系我们 kefu@qqx.com