7.5.1 单源点路径问题

  例如对有向网 G8 执行迪杰斯特拉算法的过程如动画所示。动画

算法 7.10
  void ShortestPath_DIJ( MGraph G, VertexType u )
 {
  // 用 Dijkstra 算法求有向网G从源点 u 到其余顶点的最短路径
  s = LocateVex(G, u);      // 源点 u 是图中第 s 个顶点
  for ( i=0; i<G.vexnum; ++i) {
     
     final[i] = FALSE; dist[i] = G.arcs[s][i];
   v=G.vexs[i];
   if (dist[i] < INFINITY) path = uv ;
                 // 已经找到一条从顶点 u 到顶点 v 的路径
   else path[i] = ;      // 暂时没有路径
  } // for
  dist[s] = 0; final[s] = TRUE; // 初始化,顶点 u 属于S集
  for (i=1; i<G.vexnum; ++i)
  {              // 求从源点到其余顶点的最短路径顶点
   j = minimum(dist);
       // 在集合V-S的顶点中求当前已得到的最短路径长度最小值
   if (dist[j] == INFINITY) break;
       // V-S中剩余顶点不存在从顶点 u 到它们的路径
   final[j] = TRUE;      // 当前离顶点 u 最近的 v 加入S集
   for (k=0; k<G.vexnum; ++k) // 更新其它顶点的当前最短路径
    if (!final[k] && (dist[j]+G.arcs[j][k]<dist[k])) {
                 // 修改dist[k]和path[k] G.vexs[k]∈V-S
    设 v=G.vexs[i]; 则final[i] 为TRUE表示
v∈S,即已经求得从 u 到 v 的最短路径。
 
       dist[k] = dist[j] + G.arcs[j][k];
     path[k] = path[j]+ G.vexs[k] ; // "+"表示串的联接
    } // if
   } // for k
  } // for i
 } // ShortestPath_DIJ
    容易分析出,迪杰斯特拉算法的时间复杂度和普里姆算法相同,也是O(n2),即使是只要求求一条从源点到某个特定终点之间的最短路径,但如果是应用迪杰斯特拉算法的话,那么必须先求出所有"路径长度"比它短的最短路径,因此除非它是一条路径长度最短的最短路径,否则时间复杂度仍是O(n2)的。