1 Dijkstra算法思想
首先找距离源点最近的点
此点必然是与源点直接相连的点
借助邻接矩阵S对应的行,
找最小值即得距离源点最近的点
接下来找距离源点第二近的点
或者是从S出发先到Y再到达的点,或者是与源点直接相连的点
否则与Y最近相矛盾
对于每个点,两类路比较距离取最小
此时得到从S出发经可选跳点集{y}到各点的最短路
表中最小值即得距离S第二近的点Z
2 Dijkstra算法实现
越看越像 Prim算法
finish[v0] = TRUE;
D[v0] = 0;
for (v = 0; v < G.vexnum; v++)
{
if (v != 0)
{
finish[v] = FALSE;
D[v] = G.arcs[v0][v];
}
if (D[v] < INF)
P[v] = "v0->v"
}
for (int i = 1; i <= G.vexnum - 1; i++)
{
min = INF;
for (w = 0; w < G.vexnum; w++)
{
if (finish[w] == FALSE && D[w] < min)
{
v = w;
min = D[w];
}
}
finish[v] = TRUE;
for (w = 0; w < G.vexnum; w++)
{
if (finish[w] == FALSE && (min + G.arcs[v][w] < D[w]))
{
D[w] = min + G.arcs[v][w];
P[w] = strcat(P[v], "->w");
}
}
}
3 算法推广