最短路
http://acm.hdu.edu.cn/showproblem.php?pid=2544
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条商店到赛场的路线。
输入保证至少存在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
解题代码:
floyd算法:
1 #include <math.h> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 8 const int max_n = 105; 9 const int INF = 0x3fffffff; 10 11 int map[max_n][max_n]; 12 13 int main() 14 { 15 int n, m; 16 while (~scanf ("%d%d", &n, &m) && n&&m) 17 { 18 for (int i = 0; i <= n; i ++) 19 for (int j = 0; j <= n; j ++) 20 map[i][j] = INF; 21 for (int i = 1; i <= m; i ++) 22 { 23 int a, b, c; 24 scanf ("%d%d%d", &a, &b, &c); 25 map[a][b] = map[b][a] = c; 26 } 27 for (int i = 1; i <= n; i ++) 28 { 29 for (int j = 1; j <= n; j ++) 30 for (int k = 1; k <= n; k ++) 31 if (map[j][k] > map[j][i] + map[i][k]) 32 map[j][k] = map[k][j] = map[j][i] + map[i][k]; 33 } 34 printf ("%d ", map[1][n]); 35 } 36 return 0; 37 }
dijkstra算法:
1 // File Name: 最短路 dijstra 2544.2.cpp 2 // Author: sheng 3 // Created Time: 2013年07月18日 星期四 16时27分47秒 4 5 #include <stdio.h> 6 #include <math.h> 7 #include <iostream> 8 #include <string.h> 9 using namespace std; 10 11 const int max_n = 104; 12 const int INF = 0x3fffffff; 13 int map[max_n][max_n]; 14 int vis[max_n], dis[max_n]; 15 16 int main() 17 { 18 int n, m; 19 while (~scanf("%d%d", &n, &m) && n && m) 20 { 21 for (int i = 1; i <= n; i ++) 22 for (int j = 1; j <= n; j ++) 23 map[i][j] = INF; 24 for (int i = 0; i < m; i ++) 25 { 26 int a, b, c; 27 scanf ("%d%d%d", &a, &b, &c); 28 map[a][b] = map[b][a] = c; 29 } 30 memset (vis, 0, sizeof (vis)); 31 for (int i = 1; i <= n; i ++) 32 dis[i] = map[1][i]; 33 vis[1] = 1; 34 int k; 35 for (int i = 1; i < n; i ++) 36 { 37 int min = INF; 38 for (int j = 1; j <= n; j ++) 39 { 40 if (!vis[j] && min > dis[j]) 41 { 42 min = dis[j]; 43 k = j; 44 } 45 } 46 vis[k] = 1; 47 for (int j = 1; j <= n; j ++) 48 { 49 if (!vis[j] && min + map[k][j] < dis[j]) 50 dis[j] = min + map[k][j]; 51 } 52 } 53 printf ("%d ", dis[n]); 54 } 55 return 0; 56 }