【数据结构】旅游景点咨询系统的设计与实现(图,DFS,迪杰斯特拉算法)

来源:互联网 发布:阿里云手机root 编辑:程序博客网 时间:2024/05/01 11:56

1.问题描述:

创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。

2.基本要求

(1)创建图的存储结构。

(2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道);

(3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;


3.思路:

图论中建立邻接矩阵、DFS深度优先遍历、迪杰斯特拉算法的简单应用,除DFS略有技巧性外皆为课本上的算法。首先输入景点数和路径数、各景点名、各路径的顶点下标、权值和行进方式构建图的邻接矩阵,运用迪杰斯特拉算法构建最短路(由于每次调用一次迪杰斯特拉算法和打表的算法复杂度都为O(n^3)故直接将每个点到其他点的最短路打表存二维数组名之后取用即可,数组存取复杂度O(1))。输入起点终点信息,DFS遍历输出所有路径和总路程,再输出最短路径。


4.代码及数据:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#define MAXVEX 100#define MAX 100 #define INFINITE 65535#define TRUE 1#define FALSE 0using namespace std;typedef char VertexType;typedef struct{int weight;int arrive_way;} EdgeType;typedef int Boolean;Boolean visited[MAX]; typedef struct {VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numVertexes,numEdges;}MGraph;void Create_MGraph(MGraph *G,FILE *fp){int i,j,k,w,a;fscanf(fp,"%d %d",&G->numVertexes,&G->numEdges);for(i=0;i<G->numVertexes;i++) fscanf(fp," %c",&G->vexs[i]);for(i=0;i<G->numVertexes;i++)for(j=0;j<G->numVertexes;j++){G->arc[i][j].weight=INFINITE;}for(k=0;k<G->numEdges;k++){fscanf(fp,"%d %d %d %d",&i,&j,&w,&a);G->arc[i][j].weight=w;G->arc[i][j].arrive_way=a;}}int visit[MAXVEX]={0},ans[MAXVEX];void print_all(MGraph G,int k){int mile=0;cout<<"走的路径和方法为:"<<endl ;cout<<G.vexs[ans[0]];for(int i=0;i<k;i++) {if(G.arc[ans[i]][ans[i+1]].arrive_way==0) cout<<"-步行->"<<G.vexs[ans[i+1]];else cout<<"-索道->"<<G.vexs[ans[i+1]];mile+=G.arc[ans[i]][ans[i+1]].weight;}cout<<endl;cout<<"总路程为:"<<mile<<endl;}void DFS(MGraph G,int vs,int ve,int k)//vs开始,ve结束 {ans[k]=vs;if(vs==ve){print_all(G,k);return ;}for(int i=0;i<G.numVertexes;i++){if(i==vs) continue;if(G.arc[vs][i].weight<INFINITE&&(visit[i]==FALSE)){visit[i]=TRUE;DFS(G,i,ve,k+1);visit[i]=FALSE;}}}//迪杰斯特拉算法 求最短路typedef int ShortPathTable[MAXVEX];typedef int Patharc[MAXVEX];void ShortPath_Dijkstra(MGraph G,int vs,Patharc *P) //已知起点位置 {ShortPathTable D;int v,w,k,min;int final[MAXVEX];//final[w]=1表示求得顶点vs到vw的最短路径 for(v=0;v<G.numVertexes;v++){final[v]=0;D[v]=G.arc[vs][v].weight;//将与vs有连线的顶点加上权值 (*P)[v]=vs;//路径数组P初始化为0 }D[vs]=0;//vs到vs的路径为0 final[vs]=1;//vs到vs不需要求路径//开始主循环,每次求得vs到某个v顶点的最短路径 for(v=1;v<G.numVertexes;v++){min=INFINITE;for(w=0;w<G.numVertexes;w++){if(!final[w]&&D[w]<min){k=w;min=D[w];}}final[k]=1;for(w=0;w<G.numVertexes;w++){if(!final[w]&&(min+G.arc[k][w].weight<D[w])){D[w]=min+G.arc[k][w].weight;(*P)[w]=k;}}}} void print_Shortest(MGraph G,Patharc *ans,int vs,int ve){int temp[MAXVEX],z;cout<<"由"<<G.vexs[vs]<<"到"<<G.vexs[ve]<<"的最短路径和行进方法为:"<<endl;temp[0]=ve;//temp数组倒过来输出 for(int i=1;i<G.numVertexes;i++){   ve=ans[vs][ve];   temp[i]=ve;   z=i;   if(ve==vs) break;}cout<<G.vexs[temp[z]];for(int i=z-1;i>=0;i--) {if(G.arc[temp[i+1]][temp[i]].arrive_way==0) cout<<"-步行->"<<G.vexs[temp[i]];else cout<<"-索道->"<<G.vexs[temp[i]];}cout<<endl<<endl<<endl<<endl<<endl;}int main(){cout<<"欢迎使用**旅游景点咨询系统**!"<<endl; cout<<"请输入选择的地图(1,2,3,4,5):"<<endl;int mp;cin>>mp;FILE *fp;switch(mp){case 1:fp=fopen("map1.txt","r");break;case 2:fp=fopen("map2.txt","r");break;case 3:fp=fopen("map3.txt","r");break;case 4:fp=fopen("map4.txt","r");break;case 5:fp=fopen("map5.txt","r");break;default:break; } MGraph G;Create_MGraph(&G,fp);//地图由机器自动导入 Patharc ans[MAXVEX];//ans是二维数组 ,存储每一个点,到其他每一个点的最短路径时的前驱 for(int i=0;i<G.numVertexes;i++)ShortPath_Dijkstra(G,i,ans+i);int vs,ve;cout<<"请输入您当前位置和将要去的位置(输入0 0运行结束):"<<endl;while(cin>>vs>>ve){if(vs==0&&ve==0) break;cout<<"请输入您想进行的操作(输入1获得到终点的所有路径,输入2获得到终点的最短路径):"<<endl;int casing;cin>>casing;switch(casing){case 1:cout<<"<-----------到终点的所有路径----------->"<<endl; memset(visit,FALSE,sizeof(visit));DFS(G,vs,ve,0); cout<<endl<<endl<<endl<<endl;break;case 2:cout<<"<-----------到终点的最短路径----------->"<<endl; print_Shortest(G,ans,vs,ve);break;}cout<<"请输入您当前位置和将要去的位置:"<<endl;}cout<<"~~~~~~~~~~~~~~~~~~程序运行结束,谢谢使用~~~~~~~~~~~~~~~~~~"<<endl;return 0;}  /*DATA15 17A B C D E F G H I J K L M N O 0 1 2 0 0 5 1 01 2 3 02 6 5 06 10 12 1 6 7 6 07 3 8 13 4 7 0 4 9 15 19 8 11 18 14 22 114 13 13 113 12 2 012 11 10 0 11 10 11 17 12 9 05 12 9 04 100 116 70 10 */  



阅读全文
0 0
原创粉丝点击