Dijkstra是求解某点到其他各点的最短路径算法。
开发工具 Visual Studio2010
#include <stdlib.h> #include <stdio.h> const int MAXVEX = 6;//最大顶点数 const int INF = 429496729;//无路径时的权值 /** * 狄克斯特拉算法 * @param cost 图的代价矩阵 * @param n 图的顶点数 * @param v 源点(起点)编号 */ void Dijkstra(int cost[][MAXVEX], int n, int v) { int dist[MAXVEX], path[MAXVEX]; int s[MAXVEX]; int mindis, i, j, u, pre; for(i=0; i<n; i++) { dist[i] = cost[v][i]; //初始化距离 s[i] = 0; //置空s[] //初始化路径 if(cost[v][i] < INF) path[i] = v; else path[i] = -1; } s[v] = 1; //源点编号v放入s中 path[v] = 0; //循环直到所有顶点的最短路径都求出 for(i=0; i<n; i++) { mindis = INF; u = -1; for(j=0; j<n; j++) //选取不在s中且具有最小距离的顶点u { if(s[j] == 0 && dist[j] < mindis) { u = j; mindis = dist[j]; } } if (u != -1) //找到最小距离的顶点u { s[u] = 1; //顶点u加入s中 for (j=0; j<n; j++) //修改不在s中的顶点距离 { if (s[j] == 0) { if (cost[u][j] < INF && dist[u] + cost[u][j] < dist[j]) { dist[j] = dist[u] + cost[u][j];//修改源点到vj的距离 path[j] = u;//保存当前最短路径中的前一个顶点编号 } } } } } printf("\n Dijkstra算法求解如下: "); //输出最短路径长度,路径逆序输出 for (i=0; i<n; i++) { printf("%d->%d:", v, i); if (i != v) { if (s[i] == 1) { printf("路径长度为%2d ", dist[i]); pre = i; printf("路径逆序为"); while (pre != v) //直到求解到初始顶点 { printf("%d, ", pre); pre = path[pre]; } printf("%d\n", pre); }else{ printf("不存在路径 "); } }else{ printf("不存在路径 "); } } printf("\n"); } void main() { //定义一个代价矩阵作为测试数据 INF:无路径 int cost[6][MAXVEX] = { {0, 50, 10, INF, INF, INF}, {INF, 0, 15, 50, 10, INF}, {20, INF, 0, 15, INF, INF}, {INF, 20, INF, 0, 35, INF}, {INF, INF, INF, 30, 0, INF}, {INF, INF, INF, 3, INF, 0 } }; Dijkstra(cost, 6, 1); system("pause"); }
运行效果