题目描述:
分析:
Dijkstra算法的典型应用。
源码:
#include <stdio.h> #include <limits.h> //三个数组分别记录路线,最短距离,以及标志是否已经被扩展 int map[101][101], dist[101], s[101]; void dijkstra(int n, int x); int main() { int n, m, a, b, c; int i, j; while (scanf("%d%d", &n, &m) != EOF) { if (n==0 && m==0) break; //初始化数组map for (i = 1; i <= n; i ++) { for (j = 1; j <= n; j ++) { map[i][j] = INT_MAX; } } //读取所有的边 for (i = 1; i <= m; i ++) { scanf("%d%d%d", &a, &b, &c); map[a][b] = map[b][a] = c; } dijkstra(n, 1); printf("%d ", dist[n]); } return 0; } void dijkstra(int n, int x) { //x表示源点,n表示终点 int mindis, u; int i, j; for (i = 1; i <= n; i ++) { dist[i] = map[x][i]; s[i] = 0; } //扩展源点 s[x] = 1; for (i = 1; i < n; i ++) { mindis = INT_MAX; u = -1; //找出距离最小的点,然后扩展它 for (j = 1; j <= n; j ++) { if (!s[j] && dist[j] < mindis) { u = j; mindis = dist[j]; } } s[u] = 1; for (j = 1; j <= n; j ++) { if (s[j] == 0) { if (dist[u]+map[u][j] < dist[j] && map[u][j] < INT_MAX) { dist[j] = dist[u] + map[u][j]; } } } } }