Dijkstra 实现最短路径
使用Dijkstra算法求网络图中的最短路径是一种很常见的数据结构内容。
1、求出最短路径
2、计算最短路径的线路(routine)
如下图:
程序代码:
graph.c
/* * graph.c * * Created on: 2011年8月29日 * Author: ww */ #include "graph.h" #include <stdio.h> #define N 6 #define MAX 1000000 int graph[N][N] = { { MAX, MAX, 10, MAX, 30, 100 }, { MAX, MAX, 5, MAX, MAX, MAX }, { MAX, MAX, MAX, 50, MAX, MAX }, { MAX, MAX, MAX, MAX, MAX, 10 }, { MAX, MAX, MAX, 20, MAX, 60 }, { MAX, MAX, MAX, MAX, MAX, MAX } }; int routine[N][N] = { { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0, 2, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0, 4, 0, 0, 0, 0 }, { 0, 5, 0, 0, 0, 0 } }; void Dijkstra() { int d[N] = { MAX, MAX, 10, MAX, 30, 100 }; int isMins[N] = { 0 }; int i, j = 0, min, v; for (i = 1; i < N; i++) { min = MAX; for (j = 0; j < N; j++) { if (isMins[j] != 1 && d[j] < min) { min = d[j]; v = j; } } isMins[v] = 1; for (j = 0; j < N; j++) { if (isMins[j] != 1 && min + graph[v][j] < d[j]) { d[j] = min + graph[v][j]; if (routine[j][0] == 1) { routine[j][0] = 1; routine[j][1] = v; routine[j][2] = j; } else { int x = 1; while (routine[v][x]) { routine[j][x] = routine[v][x]; x++; } routine[j][x] = j; } } } } for (i = 0; i < N; i++) { printf("0-->%d 距离为 %d \n", i, d[i]); } for (i = 1; i < N; i++) { printf("到%d的路线为:", i); for (j = 1; j < N; j++) { printf("%5d", routine[i][j]); } printf("\n"); } }
graph.h
/* * graph.h * * Created on: 2011年8月29日 * Author: ww */ #ifndef GRAPH_H_ #define GRAPH_H_ void Dijkstra(); #endif /* GRAPH_H_ */
main.c
/* * main.c * * Created on: 2011年8月21日 * Author: ww */ #include <stdio.h> #include <stdlib.h> #include "graph.h" int main(int argc, char **argv) { Dijkstra(); return 1; }
运行结果: