Dijkstra算法的基本过程
假设路网中每一个节点都有标号,记为vi,i是其编号。D[i]是从起点v0到某点vt的最短路径长度;P[i]表示从v0到vi的最短路径中i点的前一个点的编号。求解从起点v0到终点(或图中任意一点)vt的最短路径算法的基本过程为:
假设路网中每一个节点都有标号 是从出发点s到点t的最短路径长度;表示从s到t的最短路径中t点的前一个点。求解从出发点s到点t的最短路径算法的基本过程为:
- 初始化。出发点设置为:
标记起源点s,记k = s,其他所有点设为未标记。
检验从所有已标记的点k到其他直接连接的未标记的点j的距离,并设置:
选取下一个点。从所有未标记的点中选取 最小的点i,点i被选为最短路径中的一点,并设为已标记的。
找到点i的前一点。从已经标记的点集合中找到直接连接到点i的点,并标记为 。
标记点i。如果所有的点已标记,则算法结束。否则,记k = i,转到2继续。
void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D) {
int v, w, k, min;
int final[MAXVEX];//final[w]=1表示求得顶点v0到vw的最短路
for (v = 0; v < G.numVertexes; v++) {
final[v] = 0;
(*D)[v] = G.arc[v0][v];
(*P)[v] = 0;
}//用于初始化各个点的各种信息
(*D)[v0] = 0;
final[v0] = 1;
for (v = 1; v < G.numVertexes; v++) {
min = INFINITY;
for (w = 0; w < G.numVertexes; w++) {
if (!final[w] && (*D)[w] < min) {
min = (*D)[w];
k = w;
}
}//在剩下没遍历过的点中,找到距离vi最近的点
final[k] = 1;//该点已遍历
for (w = 0; w < G.numVertexes; w++) {
if (!final[w] && (min + G.arc[k][w] < (*D)[w])) {
(*D)[w] = min + G.arc[k][w];
(*P)[w] = k;
}
}
}
}