hdu 2544(最短路)
2015-06-22 10:57
363 查看
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
Sample Output
Dijkstra模板(最短路)
•v在主函数里初始化为1,表示从1开始的最短路
•dist[i]表示从1到 i 的最短路
•a[ ][ ]是个二元数组,a[ i ][ j ]=w表示i 到 j 的路径长度为 w.
•#define MAX 0x7fffffff
•一般先在主函数里把所有的a[ ][ ]置为无穷大(MAX),表示所有路都不通。
•s[ ]为一元数组,若s[ i ]=1表示 i 被划在粗线内,s[ i ]=0反之。
具体原理网上很多。
贴上此题代码:
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3 2
Dijkstra模板(最短路)
<pre name="code" class="cpp">void ShortestPath() { int i, j, u, temp, newdist; if (v<1 || v>n) return; for (i=1; i<= n; i++) { dist[i] = a[v][i]; s[i] = 0; } dist[v] = 0, s[v] = 1; for (i = 2; i <= n; i++) { temp = MAX; u = v; for (j = 1; j <= n; j++) if ((!s[j])&&(dist[j]<temp)) { u = j; temp = dist[j]; } s[u] = 1; for (int j = 1; j <= n; j++) if((!s[j])&&(a[u][j]<MAX)) { newdist = dist[u]+a[u][j]; if (newdist<dist[j]) dist[j] = newdist; } } }
•v在主函数里初始化为1,表示从1开始的最短路
•dist[i]表示从1到 i 的最短路
•a[ ][ ]是个二元数组,a[ i ][ j ]=w表示i 到 j 的路径长度为 w.
•#define MAX 0x7fffffff
•一般先在主函数里把所有的a[ ][ ]置为无穷大(MAX),表示所有路都不通。
•s[ ]为一元数组,若s[ i ]=1表示 i 被划在粗线内,s[ i ]=0反之。
具体原理网上很多。
贴上此题代码:
#include <iostream> #include <cstdio> #include <cstring> #define MAX 0x7fffffff using namespace std; int a[105][105],dist[105],s[105]; int v,m,n; void ShortestPath() { int i, j, u, temp, newdist; if (v<1 || v>n) return; for (i=1; i<= n; i++) { dist[i] = a[v][i]; s[i] = 0; } dist[v] = 0, s[v] = 1; for (i = 2; i <= n; i++) { temp = MAX; u = v; for (j = 1; j <= n; j++) if ((!s[j])&&(dist[j]<temp)) { u = j; temp = dist[j]; } s[u] = 1; for (int j = 1; j <= n; j++) if((!s[j])&&(a[u][j]<MAX)) { newdist = dist[u]+a[u][j]; if (newdist<dist[j]) dist[j] = newdist; } } } int main() { while(cin>>n>>m&&!(n==0&&m==0)) { for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) a[i][j]=MAX; for(int i=0;i<m;i++) { int x,y,z; cin>>x>>y>>z; a[x][y]=a[y][x]=z; } v=1; ShortestPath(); cout<<dist <<endl; } return 0; }
相关文章推荐
- 单点登录SSO原则的实现
- bootstrap3 标题文字类型
- 中国大学MOOC-翁恺-C语言程序设计习题集 题目号02-4 Source code
- SuspendLayout()了解方法
- Win10预览版10147 32位英文ISO镜像及语言包下载
- Lua 中 table 库函数 table.concat 连接 函数
- 一个递归+二分法的洗牌程序
- hog haar DaVinci dsp realtime 实时 移植 图像识别 机器学习 开发板
- ArcGIS 10 安装步骤说明
- Wamp安装配置
- Majority Element
- android imageloader
- Swift 编程语言新手教程
- zabbix-agent 安装
- oracle 和mysql触发器的编写有什么不同。
- groovy找到数组里的重复元素的下标
- Clean Code 读书笔记六
- 灵活使用segue导航
- 中国大学MOOC-翁恺-C语言程序设计习题集 题目号02-3 Source code
- Uva - 12627 - Erratic Expansion