【数据结构】旅游景点咨询系统的设计与实现(图,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
- 【数据结构】旅游景点咨询系统的设计与实现(图,DFS,迪杰斯特拉算法)
- 简单旅游景点咨询系统的设计与实现
- 课程设计旅游景点咨询系统
- 【算法设计与数据结构】拓扑排序算法的实现——Kahn算法及基于dfs的算法
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 数据结构与算法设计---链式栈的实现(C++)
- 算法与数据结构大纲(设计与实现)
- 数据结构课程设计-通讯录管理系统的设计与实现
- 数据结构与算法设计---链式队列的实现(C++)
- 【算法设计与数据结构】URAL 1152.False Mirrors(状态压缩dp+dfs)
- java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现
- java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现
- 数据结构与算法设计--List C++实现
- 【深度优先搜索(DFS)算法】数据结构之图的深度优先搜索算法DFS初试
- 【数据结构】通讯录查询系统的设计与实现(散列表(哈希表))
- Google和必应都无法替代的10大深网搜索引擎
- Win32汇编基础
- 硬链接与软链接
- 夜神模拟器连接Android studio
- 通讯录(sqlite3 version)
- 【数据结构】旅游景点咨询系统的设计与实现(图,DFS,迪杰斯特拉算法)
- MDK中SWD模式的设置
- WebView的基类
- struts2 action跳转指向action
- 如何判断你是否有自主创业的条件
- 1623-Enter the Dragon【贪心】
- 测试小故事33:给自己做计划
- 关于排序算法的小结
- Windows下动态链接库与静态链接库的构建