题目链接
http://poj.org/problem?id=2387
题意
有n个路标,编号1~n,输入路标编号及路标之间相隔的距离,求从路标n到路标1的最短路径(由于是无向图,所以也就是求从路标1到路标n的最短路径)。
思路
最短路径问题,由于结点数目最多可以有1000个,用Floyd算法应该会超时,而且做了之后发现输入会有相同的边,使用SPFA算法会麻烦一些,所以这里使用Dijkstra算法求解。
代码
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int INF = 0x3f3f3f; 8 const int N = 1000 + 10; 9 int map[N][N]; 10 int dist[N]; 11 int visit[N]; 12 int n, t; 13 14 void dijkstra() 15 { 16 for (int i = 1; i <= n; i++) 17 dist[i] = map[1][i]; 18 dist[1] = 0; 19 int min_dist, now = 1; 20 for (int i = 1; i <= n; i++) 21 { 22 visit[now] = 1; 23 min_dist = INF; 24 for (int j = 1; j <= n; j++) 25 { 26 if (!visit[j] && dist[j] < min_dist) 27 { 28 min_dist = dist[j]; 29 now = j; 30 } 31 } 32 visit[now] = 1; 33 for (int j = 1; j <= n; j++) 34 dist[j] = min(dist[j], dist[now] + map[now][j]); 35 } 36 printf("%d ", dist[n]); 37 } 38 39 int main() 40 { 41 //freopen("poj2387.txt", "r", stdin); 42 scanf("%d%d", &t, &n); 43 memset(map, INF, sizeof(map)); 44 int a, b, d; 45 for (int i = 0; i < t; i++) 46 { 47 scanf("%d%d%d", &a, &b, &d); 48 if(map[a][b] > d) //对于相同的边,取权值最小的那条 49 map[a][b] = map[b][a] = d; 50 } 51 dijkstra(); 52 return 0; 53 }