又是一道最短路的模板题吧,但这个题目有2个坑吧,弄的我WA了好多次。1.初始化时,自己到自己的距离为0;2.从一个点到另一个点的路有多条,所以在输入时要那条最短的路。解决了这2个就差不多了吧。
#include <stdio.h> #define maxn 0x3f3f3f3 int map[205][205], dis[205], visited[205]; void Dijkstra(int n, int start) { int mind, pre; for(int i = 0; i<n; i++) { dis[i] = map[start][i]; visited[i] = 0; } visited[start] = 1; for(int i = 0; i<n; i++) { mind = maxn; for(int j = 0; j<n; j++) { if(mind > dis[j] && !visited[j]) { mind = dis[j]; pre = j; } } visited[pre] = 1; for(int j = 0; j<n; j++) { if(dis[j] > dis[pre]+map[pre][j] && !visited[j]) dis[j] = dis[pre]+map[pre][j]; } } } int main() { int n, m; int a, b, x; int start, finish; while(scanf("%d%d", &n, &m)!=EOF) { for(int i = 0; i<n; i++) { for(int j = 0; j<n; j++) { if(i == j) map[i][j] = 0; else map[i][j] = maxn; } } while(m--) { scanf("%d%d%d", &a, &b, &x); if(map[a][b] > x || map[b][a] > x) { map[a][b] = x; map[b][a] = x; } } scanf("%d%d", &start, &finish); Dijkstra(n, start); if(!visited[finish]) printf("-1\n"); else printf("%d\n", dis[finish]); } return 0; }
原文地址:http://www.cnblogs.com/fengxmx/p/3837242.html