SlideShare a Scribd company logo
1 of 24
7.6 两点之间的最短路径问题

l 求从某个源点到其余各点的
最短路径 Dijkstra 算法

l 每一对顶点之间的最短路径
Floyd 算法
求从源点到其余各点的最短
路径的算法的基本思想 :
 依最短路径的长度递增的次序求
得各条路径
     v1            其中,从源点到
          v2
               …   顶点 v 的最短路
源点                 径是所有最短路
                   径中长度最短者
                   。
路径长度最短的最短路径的特点
:
 这条路径必定是直接从源点到该点
v 1 只含一条弧,并且这条弧的权值最
小。             v1
          23
     源点
再下一条路径长度次短的最短路径的特
点:
  它可能有三种情
                          v1
况:或者是直接从源
点到该点 v3( 只含一
条弧 ) ; 或者是从源   源点        v3
点经过顶点 v1 ,再到        v2
达该顶点 ( 由两条弧
组成 ) ;或者是从源
点经过顶点 v2 ,再到
达该顶点 v3 。
其余最短路径的特点:

 它或者是直接
从源点到该点 ( 只                v1
                20
含一条弧 ) ; 或                  1
者是从源点经过    源点 15         v3
             10
已求得最短路径           v2 3
的顶点,再到达
该顶点。 的最短路径 Min(20+1,15,10+13)=13
 源点到 v3
求最短路径的迪杰斯特拉算法:

      设置辅助数组 Dist ,其中每个分量
 Dist[k] 表示当前所求得的从源点到其余各顶
 点 k 的最短路径。

一般情况下,
Dist[k] = < 源点到顶点 k 的弧上的权值 > 或者
= < 源点到已求出最短路径的顶点的路径长度 >
+ < 已求出最短路径的顶点 到顶点 k 的弧上的
权值 > 。
1 )在所有从源点出发的弧中选取一条
权值最小的弧,即为第一条最短路径
。
           G.arcs[v 0][k ] V0 和 k 之间存在弧
Dist[k ] = 
            INFINITY V0 和 k 之间不存在弧
其中的最小值即为最短路径的长度
。
2 )修改其它各顶点的 Dist[k] 值。
假设求得最短路径的顶点为 u ,
若 Dist[u]+G.arcs[u][k]<Dist[k]
则将 Dist[k] 改为 Dist[u]+G.arcs[u]
[k] 。
v5        60                     0     1     2   3    4    5
     100

v0            30
                                  v4            D         ∞    10   50
                                                                    60
                                                                    ∞    30 100
                                                                         30 90
                                                                             60
                        10             20           0     1     2    3    4    5
              10

v1        5              50       v3        final   TF     F    F
                                                                T   F
                                                                    T    F
                                                                         T     F
                                                                               T
                   v2                               P
              0     1    2        3     4   5           D[i] 表示当前所找到的
      0       0     ∞    10       ∞     30 100          从始点 v 到每个终点 vi
邻     1       ∞     0     5       ∞     ∞ ∞             的最短路径的长度
接     2       ∞     ∞     0       50    ∞ ∞             Final[v] 为 true 表示 v
                                                        进入到 S 集 . 即找到了
矩     3       ∞     ∞    ∞         0    ∞ 10
                                                        v0 到 v 的最短路径 .v0-
阵     4       ∞     ∞    ∞        20     0 60
                                                        v 的距离为 D[v], 路径
      5       ∞     ∞    ∞        ∞     ∞ 0             保存在 P[v] 中 .
v5        60                     0        1        2   3    4    5
     100
           30                                D            ∞       10   50
                                                                       60
                                                                       ∞    30 100
                                                                            30 90
                                                                                60
v0                             v4
                     10                          0        1        2    3    4       5
                                 20
           10
                                         final    F
                                                  T       F        F
                                                                   T   F
                                                                       T    F
                                                                            T        F
                                                                                     T
v1     5              50       v3
                v2
     起点 - 距离                                         路径 Path
     终点    D                          Path            v0 v1 v2         v3 v4 v5

      v0-v1          ∞         P[v1     v0            T       F    F    F   F    F
      v0-v2          10          ]
                               P[v2    v0-v2          T       F    T    F   F    F
      v0-v3          50          ]
                               P[v3 v0-v4-v3          T       F    F    T   T    F
      v0-v4          30          ]
                               P[v4    v0-v4          T       F    F    F   T    F
      v0-v5          60          ]
                               P[v5 v0-v4-v3-v5       T       F    F    T   T    T
                                 ]
void ShortestPath_DIJ(MGraph G,int v0,PathMatrix
&P,ShortPathTable &D) {
// 用 Dijkstr 算法求有向网 G 的 v0 顶点到其余顶点 v 的最短
路径 P[v]
    及其带权长度 D[v]
// 若 P[v][w] 为 true, 则 w 是从 v0 到 v 当前求得最短路径上
的顶点
//final[v] 为 true 当且仅当 v∈S, 即已经求得从 v0 到 v 的最短
路径
 for(v=0;v<G.vexnum;++v) {
    final[v]=FALSE; D[v]=G.arcs[v0][v];
     // 设空路径
    for(w=0;w<G.vexnum;++w) P[v][w]=FALSE;
    if(D[v]<INFINITY) {
       P[v][v0]=TRUE;P[v][v]=TRUE;}
D[v0]=0; final[v0]=TRUE; // 初始化 ,v0 顶点属于 S 集
  for(i=1;i<G.vexnum;++i){       // 其余 G.vexnum-1 个顶点
     min= INFINITY; // 当前所知离 v0 顶点的最近距离
     for(w=0;w<G.vexnum;++w)
          if(!final[w])     //w 顶点不在 S 中
          if(D[w]<min) {v=w; min=D[w];} // 选离 v0 最近的
点v
      final[v]=TRUE; //v 加入 S 集合
     // 更新当前最短路径及距离
      for(w=0;w<G.vexnum;++w)
         // 修改 D[w] 和 P[w],w∈V-S
           if(!final[w]&&(min+G.arcs[v][w]<D[w])) {
                 D[w]=min+G.arcs[v][w];
                 P[w]=P[v]; P[w][w]=TRUE; //P[w]=P[v]+P[w]
            } //end if
} } //shortestPath
时间复杂度分析
l 第一个 For 循环的时间复杂度为 O(n)
l 第二个 For 循环共进行了 n-1 次 , 每次
  执行的时间是 O(n)
l 总的时间复杂度为 O(n2)
求每一对顶点之间的最短路径
       每次以一个顶点为源
点 , 重复执行 Diskstra 算法 n 次 .
便可得到每一对顶点之间的最短
路径 . 总的执行时间为 O(n3).
求每一对顶点之间的最短路
 径
弗洛伊德 Floy 算法的基本思想是:

  从 vi 到 vj 的所有可能存在的
 路径中,选出一条长度最短的路径
 。
若 <vi,vj> 存在,则存在路径 {vi,vj}
                    // 路径中不含其它顶点
若 <vi,v1>,<v1,vj> 存在,则存在路径 {vi,v1,vj}
               // 路径中所含顶点序号不大于 1
若 {vi,…,v2}, {v2,…,vj} 存在,则存在一条路径 {vi,
…, v2, …vj} // 路径中所含顶点序号不大于 2
…
  依次类推,则 vi 至 vj 的最短路径应
是上述这些路径中,路径长度最小者。
算法实现
l 定义一个 n 阶方阵序列
D(-1) , D(0) , D (1) , ...,D (k) , ...,D (k-1)
其中 D (-1) [i][j] = G.arcs[i][j]
D (k) [i][j] = Min{ D (k-1) [i][j],
  D(k-1)[i][k]+D (k-1) [k][j] }            0≤k ≤n-1
算法实现
l 分析看出 D (1) [i][j] 为从 vi 到 vj 的中间
  顶点的序号不大于 1 的最短路径的长
  度.
l D (k) [i][j] 为从 vi 到 vj 的中间顶点的序
  号不大于 k 的最短路径的长度 .
l D (n-1) [i][j] 就是从 vi 到 vj 的最短路径
  的长度 .
6                             A      B        C
    0                         1
        A     4           B            A   0      4 11
            11                         B   6      0 2
        3                 2
                  C                    C   3      ∞ 0
              2
D       D(-1)             D(0)                 D(1)                D(2)
    0    1    2       0   1        2   0       1       2       0   1      2
0   0    4 11         0   4       11   0       4       6       0   4      6
1   6    0    2       6   0        2   6       0       2       5   0      2
2   3    ∞ 0          3   7        0   3       7       0       3   7      0

        Min(CB,CAB)           Min(BAC,BC)             Min(AC,ABC)
        =Min(∞,7)=7           =Min(17,2)=2            =Min(11,6)=2
6                            A      B       C
        0                         1
            A      4        B              A   0      4 11
                 11                        B   6      0 2
             3              2
                                               3      ∞ 0
                  2C
                                           C

D           D(-1)          D(0)                D(1)                   D(2)
    0        1    2    0   1           2   0   1          2       0   1      2
0   0        4 11      0   4          11   0   4          6       0   4      6
1   6        0    2    6   0           2   6   0          2       5   0      2
2   3        ∞ 0       3   7           0   3   7          0       3   7      0
P      P(-1)       P(0)       P(1)        P(2)
     0  1     2  0  1    2  0  1    2  0   1                                  2
0      AB AC       AB AC      AB ABC      AB                                 ABC

1   BA       BC BA      BC BA      BC BAC                                    BC

2   CA          CA CAB     CA CAB     CA CAB
算法
void ShortestPath_FLOYD(MGraph G,
PathMatrix &P[],DistancMatrix &D) {
// 用 Floyd 算法求有向网各对顶点 v 和 w
之间的最短路径 P[v][w] 及其带权长度
D[v][w]. 若 P[v][w][u]=true, 则 u 是从 v
到 w 当前求得最短路径上的顶点 .
// 对各对结点之间初始已知路径及距离
For (v=0; v<G.vexnum; ++v)
   for(w=0; w<G.vexnum; ++w)
        D[v][w] = G.arcs[v][w];
        for(u=0; u<G.vexnum;++u)
                    P[v][w][u] = FALSE;
        if (D[v][w]<INFINITY){ // 从 v 到 w 有直接
   路径
            P[v][w][v] = TRUE; P[v][w][w] = TRUE;
        } //end if
    } //end for
for (u = 0; u<G.vexnum;++u)
   for(v=0; v<G.vexnum;++v)
      for(w=0; w<G.vexnum;++w)
        // 如果从 v 经 u 到 w 的一条路径更短
        if (D[v][u]+D[u][w] < D[v][w] ) {
            D[v][w] = D[v][u]+D[u][w];
        for (i=0; i < G.vexnum; ++i)
            P[v][w][i] = P[v][u][i] || P[u][w][i];
        } //end if
} //ShortestPath_FLOYD
   该算法的时间复杂度为 O ( n 3 ) , 该算法对
负权值也适用 .
最短路径问题的应用
l 交通咨询系统
        交通咨询系统可以采用
图的结构来表示实际的交通网络 . 图
中的顶点为城市 , 边表示城市之间的
交通联系 . 交通咨询系统可以回答旅
客提出的各种问题 . 见书 P186.

More Related Content

Viewers also liked

Aplicacions educatives d'eines web III
Aplicacions educatives d'eines web IIIAplicacions educatives d'eines web III
Aplicacions educatives d'eines web III
Estiu Web
 
Equivalentes de alimentos
Equivalentes  de  alimentosEquivalentes  de  alimentos
Equivalentes de alimentos
nutriajeanne
 
2012 04-18 - receita matilde
2012 04-18 - receita matilde2012 04-18 - receita matilde
2012 04-18 - receita matilde
O Ciclista
 
Enjoy ourselves
Enjoy ourselvesEnjoy ourselves
Enjoy ourselves
pakon
 
29241496 confiabilidade-conceitos-2
29241496 confiabilidade-conceitos-229241496 confiabilidade-conceitos-2
29241496 confiabilidade-conceitos-2
Margarete Santana
 
เรื่อง ทรัพย์สินทางปัญญา
เรื่อง ทรัพย์สินทางปัญญาเรื่อง ทรัพย์สินทางปัญญา
เรื่อง ทรัพย์สินทางปัญญา
FUEANG Far
 

Viewers also liked (19)

Aplicacions educatives d'eines web III
Aplicacions educatives d'eines web IIIAplicacions educatives d'eines web III
Aplicacions educatives d'eines web III
 
Equivalentes de alimentos
Equivalentes  de  alimentosEquivalentes  de  alimentos
Equivalentes de alimentos
 
2012 04-18 - receita matilde
2012 04-18 - receita matilde2012 04-18 - receita matilde
2012 04-18 - receita matilde
 
Ofna
OfnaOfna
Ofna
 
Proiect tic a_2b_filip_luminita
Proiect tic a_2b_filip_luminitaProiect tic a_2b_filip_luminita
Proiect tic a_2b_filip_luminita
 
My profile
My profileMy profile
My profile
 
Enjoy ourselves
Enjoy ourselvesEnjoy ourselves
Enjoy ourselves
 
Connections Roundtable 3
Connections Roundtable 3Connections Roundtable 3
Connections Roundtable 3
 
ระดับครูผู้ช่วย
ระดับครูผู้ช่วยระดับครูผู้ช่วย
ระดับครูผู้ช่วย
 
Cyn
CynCyn
Cyn
 
Autoavaliação
AutoavaliaçãoAutoavaliação
Autoavaliação
 
Monitoraggio 2011 12
Monitoraggio 2011 12Monitoraggio 2011 12
Monitoraggio 2011 12
 
Lab brochure IT
Lab brochure ITLab brochure IT
Lab brochure IT
 
Работа команды CUBE
Работа команды CUBEРабота команды CUBE
Работа команды CUBE
 
Pio.la cooperacion ciudadana para e ldesarrollo
Pio.la cooperacion ciudadana para e ldesarrolloPio.la cooperacion ciudadana para e ldesarrollo
Pio.la cooperacion ciudadana para e ldesarrollo
 
29241496 confiabilidade-conceitos-2
29241496 confiabilidade-conceitos-229241496 confiabilidade-conceitos-2
29241496 confiabilidade-conceitos-2
 
Frases ilustradas
Frases ilustradasFrases ilustradas
Frases ilustradas
 
Figuras linguagem2
Figuras linguagem2Figuras linguagem2
Figuras linguagem2
 
เรื่อง ทรัพย์สินทางปัญญา
เรื่อง ทรัพย์สินทางปัญญาเรื่อง ทรัพย์สินทางปัญญา
เรื่อง ทรัพย์สินทางปัญญา
 

More from Wang Yizhe (14)

第四章 串
第四章 串第四章 串
第四章 串
 
第六章 树和二叉树2
第六章 树和二叉树2第六章 树和二叉树2
第六章 树和二叉树2
 
第六章1
第六章1第六章1
第六章1
 
第九章+查找[4]
第九章+查找[4]第九章+查找[4]
第九章+查找[4]
 
第九章 查找[3]
第九章 查找[3]第九章 查找[3]
第九章 查找[3]
 
第九章 查找[2]
第九章 查找[2]第九章 查找[2]
第九章 查找[2]
 
第九章 查找[1]
第九章 查找[1]第九章 查找[1]
第九章 查找[1]
 
第三章 栈和队列(新)
第三章 栈和队列(新)第三章 栈和队列(新)
第三章 栈和队列(新)
 
第三章 栈和队列
第三章 栈和队列第三章 栈和队列
第三章 栈和队列
 
第七章 图[3]
第七章 图[3]第七章 图[3]
第七章 图[3]
 
第七章 图[2]1
第七章 图[2]1第七章 图[2]1
第七章 图[2]1
 
数据结构 总结与复习
数据结构 总结与复习数据结构 总结与复习
数据结构 总结与复习
 
第四章 串操作应用举例
第四章 串操作应用举例第四章 串操作应用举例
第四章 串操作应用举例
 
第二章 线性表
第二章 线性表第二章 线性表
第二章 线性表
 

第七章 图[4]1

  • 1. 7.6 两点之间的最短路径问题 l 求从某个源点到其余各点的 最短路径 Dijkstra 算法 l 每一对顶点之间的最短路径 Floyd 算法
  • 2. 求从源点到其余各点的最短 路径的算法的基本思想 : 依最短路径的长度递增的次序求 得各条路径 v1 其中,从源点到 v2 … 顶点 v 的最短路 源点 径是所有最短路 径中长度最短者 。
  • 3. 路径长度最短的最短路径的特点 : 这条路径必定是直接从源点到该点 v 1 只含一条弧,并且这条弧的权值最 小。 v1 23 源点
  • 4. 再下一条路径长度次短的最短路径的特 点: 它可能有三种情 v1 况:或者是直接从源 点到该点 v3( 只含一 条弧 ) ; 或者是从源 源点 v3 点经过顶点 v1 ,再到 v2 达该顶点 ( 由两条弧 组成 ) ;或者是从源 点经过顶点 v2 ,再到 达该顶点 v3 。
  • 5. 其余最短路径的特点: 它或者是直接 从源点到该点 ( 只 v1 20 含一条弧 ) ; 或 1 者是从源点经过 源点 15 v3 10 已求得最短路径 v2 3 的顶点,再到达 该顶点。 的最短路径 Min(20+1,15,10+13)=13 源点到 v3
  • 6. 求最短路径的迪杰斯特拉算法: 设置辅助数组 Dist ,其中每个分量 Dist[k] 表示当前所求得的从源点到其余各顶 点 k 的最短路径。 一般情况下, Dist[k] = < 源点到顶点 k 的弧上的权值 > 或者 = < 源点到已求出最短路径的顶点的路径长度 > + < 已求出最短路径的顶点 到顶点 k 的弧上的 权值 > 。
  • 7. 1 )在所有从源点出发的弧中选取一条 权值最小的弧,即为第一条最短路径 。 G.arcs[v 0][k ] V0 和 k 之间存在弧 Dist[k ] =   INFINITY V0 和 k 之间不存在弧 其中的最小值即为最短路径的长度 。
  • 8. 2 )修改其它各顶点的 Dist[k] 值。 假设求得最短路径的顶点为 u , 若 Dist[u]+G.arcs[u][k]<Dist[k] 则将 Dist[k] 改为 Dist[u]+G.arcs[u] [k] 。
  • 9. v5 60 0 1 2 3 4 5 100 v0 30 v4 D ∞ 10 50 60 ∞ 30 100 30 90 60 10 20 0 1 2 3 4 5 10 v1 5 50 v3 final TF F F T F T F T F T v2 P 0 1 2 3 4 5 D[i] 表示当前所找到的 0 0 ∞ 10 ∞ 30 100 从始点 v 到每个终点 vi 邻 1 ∞ 0 5 ∞ ∞ ∞ 的最短路径的长度 接 2 ∞ ∞ 0 50 ∞ ∞ Final[v] 为 true 表示 v 进入到 S 集 . 即找到了 矩 3 ∞ ∞ ∞ 0 ∞ 10 v0 到 v 的最短路径 .v0- 阵 4 ∞ ∞ ∞ 20 0 60 v 的距离为 D[v], 路径 5 ∞ ∞ ∞ ∞ ∞ 0 保存在 P[v] 中 .
  • 10. v5 60 0 1 2 3 4 5 100 30 D ∞ 10 50 60 ∞ 30 100 30 90 60 v0 v4 10 0 1 2 3 4 5 20 10 final F T F F T F T F T F T v1 5 50 v3 v2 起点 - 距离 路径 Path 终点 D Path v0 v1 v2 v3 v4 v5 v0-v1 ∞ P[v1 v0 T F F F F F v0-v2 10 ] P[v2 v0-v2 T F T F F F v0-v3 50 ] P[v3 v0-v4-v3 T F F T T F v0-v4 30 ] P[v4 v0-v4 T F F F T F v0-v5 60 ] P[v5 v0-v4-v3-v5 T F F T T T ]
  • 11. void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &P,ShortPathTable &D) { // 用 Dijkstr 算法求有向网 G 的 v0 顶点到其余顶点 v 的最短 路径 P[v] 及其带权长度 D[v] // 若 P[v][w] 为 true, 则 w 是从 v0 到 v 当前求得最短路径上 的顶点 //final[v] 为 true 当且仅当 v∈S, 即已经求得从 v0 到 v 的最短 路径 for(v=0;v<G.vexnum;++v) { final[v]=FALSE; D[v]=G.arcs[v0][v]; // 设空路径 for(w=0;w<G.vexnum;++w) P[v][w]=FALSE; if(D[v]<INFINITY) { P[v][v0]=TRUE;P[v][v]=TRUE;}
  • 12. D[v0]=0; final[v0]=TRUE; // 初始化 ,v0 顶点属于 S 集 for(i=1;i<G.vexnum;++i){ // 其余 G.vexnum-1 个顶点 min= INFINITY; // 当前所知离 v0 顶点的最近距离 for(w=0;w<G.vexnum;++w) if(!final[w]) //w 顶点不在 S 中 if(D[w]<min) {v=w; min=D[w];} // 选离 v0 最近的 点v final[v]=TRUE; //v 加入 S 集合 // 更新当前最短路径及距离 for(w=0;w<G.vexnum;++w) // 修改 D[w] 和 P[w],w∈V-S if(!final[w]&&(min+G.arcs[v][w]<D[w])) { D[w]=min+G.arcs[v][w]; P[w]=P[v]; P[w][w]=TRUE; //P[w]=P[v]+P[w] } //end if } } //shortestPath
  • 13. 时间复杂度分析 l 第一个 For 循环的时间复杂度为 O(n) l 第二个 For 循环共进行了 n-1 次 , 每次 执行的时间是 O(n) l 总的时间复杂度为 O(n2)
  • 14. 求每一对顶点之间的最短路径 每次以一个顶点为源 点 , 重复执行 Diskstra 算法 n 次 . 便可得到每一对顶点之间的最短 路径 . 总的执行时间为 O(n3).
  • 15. 求每一对顶点之间的最短路 径 弗洛伊德 Floy 算法的基本思想是: 从 vi 到 vj 的所有可能存在的 路径中,选出一条长度最短的路径 。
  • 16. 若 <vi,vj> 存在,则存在路径 {vi,vj} // 路径中不含其它顶点 若 <vi,v1>,<v1,vj> 存在,则存在路径 {vi,v1,vj} // 路径中所含顶点序号不大于 1 若 {vi,…,v2}, {v2,…,vj} 存在,则存在一条路径 {vi, …, v2, …vj} // 路径中所含顶点序号不大于 2 … 依次类推,则 vi 至 vj 的最短路径应 是上述这些路径中,路径长度最小者。
  • 17. 算法实现 l 定义一个 n 阶方阵序列 D(-1) , D(0) , D (1) , ...,D (k) , ...,D (k-1) 其中 D (-1) [i][j] = G.arcs[i][j] D (k) [i][j] = Min{ D (k-1) [i][j], D(k-1)[i][k]+D (k-1) [k][j] } 0≤k ≤n-1
  • 18. 算法实现 l 分析看出 D (1) [i][j] 为从 vi 到 vj 的中间 顶点的序号不大于 1 的最短路径的长 度. l D (k) [i][j] 为从 vi 到 vj 的中间顶点的序 号不大于 k 的最短路径的长度 . l D (n-1) [i][j] 就是从 vi 到 vj 的最短路径 的长度 .
  • 19. 6 A B C 0 1 A 4 B A 0 4 11 11 B 6 0 2 3 2 C C 3 ∞ 0 2 D D(-1) D(0) D(1) D(2) 0 1 2 0 1 2 0 1 2 0 1 2 0 0 4 11 0 4 11 0 4 6 0 4 6 1 6 0 2 6 0 2 6 0 2 5 0 2 2 3 ∞ 0 3 7 0 3 7 0 3 7 0 Min(CB,CAB) Min(BAC,BC) Min(AC,ABC) =Min(∞,7)=7 =Min(17,2)=2 =Min(11,6)=2
  • 20. 6 A B C 0 1 A 4 B A 0 4 11 11 B 6 0 2 3 2 3 ∞ 0 2C C D D(-1) D(0) D(1) D(2) 0 1 2 0 1 2 0 1 2 0 1 2 0 0 4 11 0 4 11 0 4 6 0 4 6 1 6 0 2 6 0 2 6 0 2 5 0 2 2 3 ∞ 0 3 7 0 3 7 0 3 7 0 P P(-1) P(0) P(1) P(2) 0 1 2 0 1 2 0 1 2 0 1 2 0 AB AC AB AC AB ABC AB ABC 1 BA BC BA BC BA BC BAC BC 2 CA CA CAB CA CAB CA CAB
  • 21. 算法 void ShortestPath_FLOYD(MGraph G, PathMatrix &P[],DistancMatrix &D) { // 用 Floyd 算法求有向网各对顶点 v 和 w 之间的最短路径 P[v][w] 及其带权长度 D[v][w]. 若 P[v][w][u]=true, 则 u 是从 v 到 w 当前求得最短路径上的顶点 .
  • 22. // 对各对结点之间初始已知路径及距离 For (v=0; v<G.vexnum; ++v) for(w=0; w<G.vexnum; ++w) D[v][w] = G.arcs[v][w]; for(u=0; u<G.vexnum;++u) P[v][w][u] = FALSE; if (D[v][w]<INFINITY){ // 从 v 到 w 有直接 路径 P[v][w][v] = TRUE; P[v][w][w] = TRUE; } //end if } //end for
  • 23. for (u = 0; u<G.vexnum;++u) for(v=0; v<G.vexnum;++v) for(w=0; w<G.vexnum;++w) // 如果从 v 经 u 到 w 的一条路径更短 if (D[v][u]+D[u][w] < D[v][w] ) { D[v][w] = D[v][u]+D[u][w]; for (i=0; i < G.vexnum; ++i) P[v][w][i] = P[v][u][i] || P[u][w][i]; } //end if } //ShortestPath_FLOYD 该算法的时间复杂度为 O ( n 3 ) , 该算法对 负权值也适用 .
  • 24. 最短路径问题的应用 l 交通咨询系统 交通咨询系统可以采用 图的结构来表示实际的交通网络 . 图 中的顶点为城市 , 边表示城市之间的 交通联系 . 交通咨询系统可以回答旅 客提出的各种问题 . 见书 P186.