图论---最短路(记录路径)
来源:互联网 发布:软件使用合同 编辑:程序博客网 时间:2024/06/17 03:45
设计任务
校园导游咨询
问题描述:
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
基本要求:
⑴设计华东交通大学的校园平面图,所含景点不少于10个。以图 中顶点表示校内各景点。
⑵存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
⑶为来访客人提供图中任意景点相关信息的查询。
⑷为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
详细设计思想
1、概要设计
算法 设计:考虑到校园地点数的局限性,此课题完全可以用floy算法或者Dijkstra算法来解决,
我选择的是Dijkstra算法,因为算法执行速度要比floy算法更高效,性能更好,其次就是使用前驱
或者后驱来记录,实现一个路线记录的效果..
//// Dijkstra算法代码:#define inf 1000000000const int maxx = 300;int temp; /// 地点的个数int mark[maxx<<1]; /// 标记便于求最短路int g[maxx][maxx]; /// 校园景点图int dist[maxx]; /// 单源最短路储存int pre[maxx]; /// 前驱记录路径struct Node{ string name; /// 景点地名 int num; /// 景点代号 string introduce; /// 景点介绍 }school[maxx];void Dijkstra(int start,int end) /// 求最短路 {for(int i=1;i<=temp;i++){dist[i]=g[start][i];pre[i]=start;mark[i]=0;}dist[start]=0;mark[start]=1;pre[start]=-1;for(int i=1;i<=temp;i++){int min=inf;int u=-1;for(int j=1;j<=temp;j++){if(mark[j]==0 && dist[j]<min){min=dist[j];u=j;}}mark[u]=1;if(u<0) break;for(int j=1 ; j<=temp ; j++){if(mark[j]==0 && dist[j]>dist[u]+g[u][j]){dist[j]=dist[u]+g[u][j];pre[j]=u;}}}if(dist[end] < inf) /// 判断最短路是否存在? { cout<<"距离: "<<dist[end]<<endl; cout<<"路径:"; int road[100],ss=0; road[ss++]=end; while(pre[end]!=start){ /// 记录路径 road[ss++]=pre[end]; end=pre[end]; } road[ss++]=start; cout<<school[road[ss-1]].name; for(int i=ss - 2 ; i>=0 ;i--) /// 打印路径 { cout<<"--->"<<school[road[i]].name; } cout<<endl;} else cout<<"路径不存在~"<<endl;cout<<"请按任意键返回!";system("pause");} //// Floy 算法代码:#define inf 1000000000const int maxx = 300;int temp; /// 地点的个数int mark[maxx<<1]; /// 标记便于求最短路int g[maxx][maxx]; /// 校园景点图int dist[maxx][maxx]; /// 单源最短路储存int pre[maxx][maxx]; /// 前驱记录路径struct Node{ string name; /// 景点地名 int num; /// 景点代号 string introduce; /// 景点介绍 }school[maxx];void Floy(int start,int end) /// 求最短路 {for(int i=1;i<=temp;i++){ /// 初始化 for(int j=1;j<=temp;j++){ dist[i][j]=g[i][j]; }}int n=temp;for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(dist[i][j] > dist[i][k]+dist[k][j]){ dist[i][j]=dist[i][k]+dist[k][j]; //// 更新路径 pre[i][j] = pre[i][k]; //// 记录路径 } if(dist[start][end]==inf) cout<<"路径不存在~"<<endl; else { cout<<"最短路:"<<dist[start][end]<<endl; cout<<"打印路径: \n"<<start; while(start!=end){ /// 打印路径 cout<<"-->"<<pre[start][end]; start=pre[start][end]; } }cout<<"请按任意键返回!";system("pause");}算法性能分析: Dijkstra 算法时间复杂度为N的平方,Floy 时间复杂度为N的三次方 ,其中N为问题的规模
floy 算法神牛博客:
http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html
- 图论---最短路(记录路径)
- 最短路 记录路径
- 最短路+记录路径+变形!!
- POJ2457 Part Acquisition(Spfa最短路+记录路径)
- HDOJ--1385--Minimum Transport Cost(最短路记录路径)
- hdu 1385 Minimum Transport Cost(最短路+记录路径)
- 兔子与樱花(map+最短路+记录路径)
- bzoj3445[Usaco2014 Feb] Roadblock 最短路(记录路径)
- codevs 玛丽卡(最短路路径记录)
- uva 11374 最短路+记录路径 dijkstra最短路模板
- 【最短路】poj2457 SPFA+记录路径
- dijkstra求最短路并记录路径
- Coderforces 20C 最短路记录路径
- 最短路(输出路径)
- 偷西瓜(SPFA运用链式前向星来记录路径+删除路径+求最短路和次短路)
- hdoj2544_最短路(最短路径)
- 最短路(最短路径)
- HDU2544最短路(最短路径)
- Servlet第四章知识点总结——资源访问
- android触屏事件处理onInterceptTouchEvent的问题
- ubuntu codeblocks 12.11 安装
- c#利用委托进行异步跨线程加载到窗体数据
- IListSource 不包含任何数据源
- 图论---最短路(记录路径)
- LVS集群中的IP负载均衡技术
- Java基本类型包装类
- Servlet第五章知识点总结——HTTP Servlet中持久化状态
- Fedora14下Mplayer安装小结
- JS 中怎么写正则表达式
- char*与wchar_t*(LPTSTR) 如何相互转换 (2010-12-15 16:01)
- 嵌入式linux学习路线参考
- 线程局部存储,Part 1:概述