Dijkstra算法:
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 102 int map[N][N]; int flags[N]; int dist[N]; int min(int a, int b) {return a>b? b:a;} int n; int Dijkstra(int source) { /* map[][] = 0;无边,非0为权值 dist[] = 0;未更新, 非0 已更新 */ int i, j, st, mark, MIN; st = source; flags[st] = 1; dist[st] = 0; mark = source; for(i = 0; i < n; i++) { MIN = 0xffff; for(j = 0; j< n;j++) { if(!flags[j]&&map[st][j]) { if(dist[j] == 0) { dist[j] = dist[st]+map[st][j]; } else { dist[j] = min(dist[j], dist[st]+map[st][j]); } if(dist[j] < MIN) { MIN = dist[j]; mark =j; } } } flags[st] = 1; st = mark; } } int main() { int m,i, s, e, l; /*printf("Input node num and edge num\n");*/ while(1) { scanf("%d %d",&n, &m); if((n ==0)&&(m==0)) break; memset(map,0,sizeof(map)); memset(flags, 0,sizeof(flags)); memset(dist, 0, sizeof(dist)); for(i = 0; i< m; i++) { scanf("%d %d %d", &s, &e, &l); map[s-1][e-1] = l; map[e-1][s-1] = l; } Dijkstra(0); /*for(i = 0; i<n;i++) { printf("%d ",dist[i]); }*/ printf("%d\n",dist[n-1]); } return 0; } /* 3 3 0 1 5 1 2 5 2 0 2 */