d图论例子(存档)(北邮信通院陈鑫林教授授课PPT)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的不多于k条弧的最短有向路径的长度首先设显然从s到j至多含k1条弧的最短有向路径可能由k1条弧或较少的弧构成若它正好含k1条中的最后一条弧那么可以看成是由从s到i的含k条弧的最短路径和后续弧ij构成因此得的长度是如果因此对kn时算法终止
若干补充
1.Ford(1956)-Moore(1957)-Bellman(1958) 算法
l (j k 1) l (Ps(,kj 1) ) min[li(k ) l (i, j)]
) Ps(,kj 1) 含k条或较少的弧,则 l (j k 1) l (j k. 如果 ( k 1) (k ) 因此对k<n, l j l j 时,算法终止.如果在k=n-1时 对某个j有 l (j k 1) l (j k ) ,那么网中必有负向回路,算法失
算法在k=4<n=7次迭代终止.
s 1 : Ps(,1) ( s,1), l ( Ps(,1) ) 4, 1 1 s 2 : Ps(,1) ( s,2), l ( Ps(,1) ) 6, 2 2 s 5 : Ps(,2 ) ( s,2), ( 2,5), l ( Ps(,2 ) ) 0, 5 5 s 4 : Ps(,3) Ps(,2 ) , (5,4) ( s,2), ( 2,5), (5,4), l ( Ps(,3) ) 5, 4 5 4 s 3 : Ps(,4 ) Ps(,3) , (4,3) ( s,2), (2,5), (5,4), ( 4,3), l ( Ps(,4 ) ) 3, 3 4 3 s 6 : Ps(,4 ) Ps(,3) , (4,6) ( s,2), ( 2,5), (5,4), ( 4,6), l ( Ps(,4 ) ) 0. 6 4 6
0 0 0 3 3 5 5 7
0 0 0 0 0 5 5 7
3 3 0 0 3 5 5 7
3 3 0 3 0 0 0 7
5 5 5 5 0 0 0 7
5 5 5 5 0 0 0 0
7 7 7 7 7 7 0 12 0
v1
3
1
6
2
v4
4
v6
2
v2
8 v v3 5
v7 3 1 9 v8
min{ , min[6 7,5 8]} 3, (再 经4) 13
( ( l4 4 ) min{ 43) , l1( 3) l (1,4), l5 3) l (5,4)]}} l(
min{ 5, min[4 5,0 5]]} 5,
( ( ( l5 4 ) min{ 5 3) , l23) l ( 2,5), l3 3) l (3,5)]}} l(
由于Dijkstra算法只适用于弧长为正的情形,而 Ford(1956)-Moore(1957)-Bellman(1958)算法适 用于弧长可为负,但不含负的有向回路的情形,并且 在许多通信的论文中得到广泛应用,所以特做介绍.
1
Ford(1956)-Moore(1957)-Bellman(1958)算法 它适用于弧长可为负,但不含负的有向回路的情形. 算法思路:从s到j至多k+1条弧的最短有向路径可以 由从s到j至多含k条弧的最短路径得到.因此,在第 k次迭代结束时,节点的标记就表示从s出发的含不多 于k+1条弧的最短路径的长度. 设l 是给定的有n个节点的网络G(V,E,l)中从s到j 的不多于k条弧的最短有向路径的长度, 首先设 ls ls(k ) 0, l (j1) l (s, j), j 1,2,, n 1
( ( l4 2 ) 9, l41)
4
2 1
5 8 5
4 4
( l6 4 ) 0 ( l6 3 ) 4
S
3
l
( 2) 3 (1) 3
13
l
( 2) 6
6
6
2
l
( l61)
7
( ( l2 4 ) 6, l23) 6
6
5
( ( l5 4 ) 0, l5 3) 0
min{ , min[6 6,13 4]} 0, 0
( ( ( l6 4 ) min{ 63) , l43) l ( 4,6), l5 3) l (5,6)]}} l(
min{ , min[5 5,0 4]} 0, (再 经4) 4
7
第 四 次 迭 代k 4) ( l ( 5) min{ ( 4 ) , mini [li( 4 ) l (i, j )]} l ( 4 ) , lj j j
min{ , min[6 7, 8]} 13, 经2) (
( ( l4 2 ) min{ 41) , l1(1) l (1,4), l51) l (5,4)} min{ ,9} 9, 经 ) l( ( 1 ( ( ( l5 2 ) min{ 51) , l21) l ( 2,5), l31) l (3,5)]}} min{ ,0} 0, 经2) l( ( ( ( ( l6 2 ) min{ 61) , l41) l ( 4,6), l51) l (5,6)]}} , l(
5
例
D (0)
9 1 0
11
D (1)
0 3 1 5 9 11 12 13
3 1 5 9 11 12 0 2 6 10 12 13 2 0 4 8 10 11 6 4 0 12 14 15 10 8 12 0 2 3 12 10 14 2 0 5 13 11 15 3 5 0 14 12 16 4 6 1
不论那种情况,与其它端间的最短径长用下述公式 计算:
wsk Min[dsi wik , dsj wjk ]
(3)稀疏网的情况下可把全图分成几个部分来计算, 然后合并.当网的边数远少于全联网的边数时,称 稀疏网.此时往往存在割端或端数较少的割端. 对于有割端v s 的网G,去掉后就把G分成几部分(例 如三部分G1,G2,G3), 用Floyd算法分别求出 G1 {vs }, G2 {vs }, G3 {vs } W ' ,W '' ,W '''及路由阵.若 v G , v G 的最短距离阵 i 1 2 2 则 vi , v j 间最短距离为
( ( l1( 4 ) min{1( 3) , min[l23) l ( 2,1), l3 3) l (3,1)]} 4, l ( ( l2 4 ) min{ 23) } l23) 6, l( ( ( ( l3 4 ) min{ 3 3) , min[l23) l ( 2,3), l43) l ( 4,3)]} l(
min{ , min[6 6,13 4]} 0, 0
( ( ( l63) min{ 6 2 ) , l4 2 ) l ( 4,6), l5 2 ) l (5,6)]}} l(
min{ , min[9 5,0 4]} 4, (经5)
6
第 三 次 迭 代k 3) (
(k ) j
对 所 有i, j ) E , ( l (j k 1) min{ (j k ) , min[li( k ) l (i, j )]},i j, s, j 1,2,, n 1 l
2
显然,从s到j至多含k+1条弧的最短有向路径 P 可能由k+1条弧或较少的弧构成,若它正好含k+1条 ) ) 弧,则设(i,j)是Ps(,kj 1中的最后一条弧,那么Ps(,kj 1可以 (k ) 看成是由从s到i的含k条弧的最短路径 Ps,i 和后续弧 ( k 1) (i,j)构成,因此得Ps , j 的长度是
l
( 2) 2
6, l
(1) 2
6
l
( 2) 5
0, l
(1) 5
4
( 初 始 : l1(1) 4, l21) 6, li(1) , i 3,4,5,6
第 一 次 迭 代k 1) (
( ( l1( 2 ) min{1(1) , min[l21) l ( 2,1), l31) l (3,1)]} l
( k 1) s, j
效,并在第n-1次迭代时终止.表明有负向回路.
O(n3 ) 算法的计算复杂度为
3
例
l1( 4 ) 4, l1( 3) 4 l1( 2 ) 4, l1(1) 4
( ( l4 4 ) 5, l43) 5
1 4
lS 0
5
( l3 4 ) 3 ( l3 3) 13
min{ , min[6 7,9 8]} 13, 13
( ( l43) min{ 4 2 ) , l1( 2 ) l (1,4), l5 2 ) l (5,4)]}} l(
min{ , min[4 5,0 5]]} 5, (再 经5) 9
( ( ( l5 3) min{ 5 2 ) , l2 2 ) l ( 2,5), l3 2 ) l (3,5)]}} l(
0 3 3 0 D (1) 1 2 5 6 9 10
1 2 0
5 6 4
4 0 8 12
9 10 8 12 0
0 0 R (1) 0 3 3
wij w w
' is
'' js
10
v1
3
1
6
2
v4
4
0 3 1 6 3 0 2
v6
2
1 2 0 4 8
v2
8 v v3 5
v7 3 1 9 v8
6 4 0 8 0 2 3 9 2 0 5 3 5 0 1
0 0 3 0 0 3 0 0 0 3 0 0
13
5
0 3 1 5 0 3 0 2 6 0 (1) (1) D , R 1 2 0 4 0 5 6 4 0 3 d 35 8, wi 5 wi 3 d 35 2) (
( ( l1( 3) min{ 1( 2 ) , min[l2 2 ) l ( 2,1), l3 2 ) l (3,1)]} l
min{ , min(6 1,13 2)} 4 4
( ( l23) min{ 2 2 ) } l2 2 ) 6, l( ( ( ( l3 3) min{ 3 2 ) , min[l2 2 ) l ( 2,3), l4 2 ) l ( 4,3)]} l(
13 14 12 16 4 6 1 0
w18 13, v1 v7 v8 , v1 v5 v7 , v1 v3 v5 , v1 v3 , v1 v3 v5 v7 v8 ,
R (1)
0 0 0 3 3 5 5 7
8
2.Floyd算法在以下情况可以简化:
(1)如有度数为1的端,可把它们去掉再做计算; 设 v s为度数为1的端,它只与 v i 相连,则 v s 与其它 端的最短径必经 v i ,所以
wsj d si wij (w表最短距离 )
(2)如有度数为2的端,则按下述方法去掉: 设 v s为度数为2的端,它只与 vi 和v j 相连, 若 d sj d si dij ,则可简单地去掉 v s 若 d sj d si dij ,也可去掉v s ,但把 dij 改成 d sj d si ; 9
min{ , min(6 1, 2)} 4, 4
( ( l2 2 ) min{ 21) } l21) 6, (除s外, 无 其 它 到 的 径) l( 2 ( ( ( l3 2 ) min{ 31) , min[l21) l ( 2,3), l41) l ( 4,3)]} l(
若干补充
1.Ford(1956)-Moore(1957)-Bellman(1958) 算法
l (j k 1) l (Ps(,kj 1) ) min[li(k ) l (i, j)]
) Ps(,kj 1) 含k条或较少的弧,则 l (j k 1) l (j k. 如果 ( k 1) (k ) 因此对k<n, l j l j 时,算法终止.如果在k=n-1时 对某个j有 l (j k 1) l (j k ) ,那么网中必有负向回路,算法失
算法在k=4<n=7次迭代终止.
s 1 : Ps(,1) ( s,1), l ( Ps(,1) ) 4, 1 1 s 2 : Ps(,1) ( s,2), l ( Ps(,1) ) 6, 2 2 s 5 : Ps(,2 ) ( s,2), ( 2,5), l ( Ps(,2 ) ) 0, 5 5 s 4 : Ps(,3) Ps(,2 ) , (5,4) ( s,2), ( 2,5), (5,4), l ( Ps(,3) ) 5, 4 5 4 s 3 : Ps(,4 ) Ps(,3) , (4,3) ( s,2), (2,5), (5,4), ( 4,3), l ( Ps(,4 ) ) 3, 3 4 3 s 6 : Ps(,4 ) Ps(,3) , (4,6) ( s,2), ( 2,5), (5,4), ( 4,6), l ( Ps(,4 ) ) 0. 6 4 6
0 0 0 3 3 5 5 7
0 0 0 0 0 5 5 7
3 3 0 0 3 5 5 7
3 3 0 3 0 0 0 7
5 5 5 5 0 0 0 7
5 5 5 5 0 0 0 0
7 7 7 7 7 7 0 12 0
v1
3
1
6
2
v4
4
v6
2
v2
8 v v3 5
v7 3 1 9 v8
min{ , min[6 7,5 8]} 3, (再 经4) 13
( ( l4 4 ) min{ 43) , l1( 3) l (1,4), l5 3) l (5,4)]}} l(
min{ 5, min[4 5,0 5]]} 5,
( ( ( l5 4 ) min{ 5 3) , l23) l ( 2,5), l3 3) l (3,5)]}} l(
由于Dijkstra算法只适用于弧长为正的情形,而 Ford(1956)-Moore(1957)-Bellman(1958)算法适 用于弧长可为负,但不含负的有向回路的情形,并且 在许多通信的论文中得到广泛应用,所以特做介绍.
1
Ford(1956)-Moore(1957)-Bellman(1958)算法 它适用于弧长可为负,但不含负的有向回路的情形. 算法思路:从s到j至多k+1条弧的最短有向路径可以 由从s到j至多含k条弧的最短路径得到.因此,在第 k次迭代结束时,节点的标记就表示从s出发的含不多 于k+1条弧的最短路径的长度. 设l 是给定的有n个节点的网络G(V,E,l)中从s到j 的不多于k条弧的最短有向路径的长度, 首先设 ls ls(k ) 0, l (j1) l (s, j), j 1,2,, n 1
( ( l4 2 ) 9, l41)
4
2 1
5 8 5
4 4
( l6 4 ) 0 ( l6 3 ) 4
S
3
l
( 2) 3 (1) 3
13
l
( 2) 6
6
6
2
l
( l61)
7
( ( l2 4 ) 6, l23) 6
6
5
( ( l5 4 ) 0, l5 3) 0
min{ , min[6 6,13 4]} 0, 0
( ( ( l6 4 ) min{ 63) , l43) l ( 4,6), l5 3) l (5,6)]}} l(
min{ , min[5 5,0 4]} 0, (再 经4) 4
7
第 四 次 迭 代k 4) ( l ( 5) min{ ( 4 ) , mini [li( 4 ) l (i, j )]} l ( 4 ) , lj j j
min{ , min[6 7, 8]} 13, 经2) (
( ( l4 2 ) min{ 41) , l1(1) l (1,4), l51) l (5,4)} min{ ,9} 9, 经 ) l( ( 1 ( ( ( l5 2 ) min{ 51) , l21) l ( 2,5), l31) l (3,5)]}} min{ ,0} 0, 经2) l( ( ( ( ( l6 2 ) min{ 61) , l41) l ( 4,6), l51) l (5,6)]}} , l(
5
例
D (0)
9 1 0
11
D (1)
0 3 1 5 9 11 12 13
3 1 5 9 11 12 0 2 6 10 12 13 2 0 4 8 10 11 6 4 0 12 14 15 10 8 12 0 2 3 12 10 14 2 0 5 13 11 15 3 5 0 14 12 16 4 6 1
不论那种情况,与其它端间的最短径长用下述公式 计算:
wsk Min[dsi wik , dsj wjk ]
(3)稀疏网的情况下可把全图分成几个部分来计算, 然后合并.当网的边数远少于全联网的边数时,称 稀疏网.此时往往存在割端或端数较少的割端. 对于有割端v s 的网G,去掉后就把G分成几部分(例 如三部分G1,G2,G3), 用Floyd算法分别求出 G1 {vs }, G2 {vs }, G3 {vs } W ' ,W '' ,W '''及路由阵.若 v G , v G 的最短距离阵 i 1 2 2 则 vi , v j 间最短距离为
( ( l1( 4 ) min{1( 3) , min[l23) l ( 2,1), l3 3) l (3,1)]} 4, l ( ( l2 4 ) min{ 23) } l23) 6, l( ( ( ( l3 4 ) min{ 3 3) , min[l23) l ( 2,3), l43) l ( 4,3)]} l(
min{ , min[6 6,13 4]} 0, 0
( ( ( l63) min{ 6 2 ) , l4 2 ) l ( 4,6), l5 2 ) l (5,6)]}} l(
min{ , min[9 5,0 4]} 4, (经5)
6
第 三 次 迭 代k 3) (
(k ) j
对 所 有i, j ) E , ( l (j k 1) min{ (j k ) , min[li( k ) l (i, j )]},i j, s, j 1,2,, n 1 l
2
显然,从s到j至多含k+1条弧的最短有向路径 P 可能由k+1条弧或较少的弧构成,若它正好含k+1条 ) ) 弧,则设(i,j)是Ps(,kj 1中的最后一条弧,那么Ps(,kj 1可以 (k ) 看成是由从s到i的含k条弧的最短路径 Ps,i 和后续弧 ( k 1) (i,j)构成,因此得Ps , j 的长度是
l
( 2) 2
6, l
(1) 2
6
l
( 2) 5
0, l
(1) 5
4
( 初 始 : l1(1) 4, l21) 6, li(1) , i 3,4,5,6
第 一 次 迭 代k 1) (
( ( l1( 2 ) min{1(1) , min[l21) l ( 2,1), l31) l (3,1)]} l
( k 1) s, j
效,并在第n-1次迭代时终止.表明有负向回路.
O(n3 ) 算法的计算复杂度为
3
例
l1( 4 ) 4, l1( 3) 4 l1( 2 ) 4, l1(1) 4
( ( l4 4 ) 5, l43) 5
1 4
lS 0
5
( l3 4 ) 3 ( l3 3) 13
min{ , min[6 7,9 8]} 13, 13
( ( l43) min{ 4 2 ) , l1( 2 ) l (1,4), l5 2 ) l (5,4)]}} l(
min{ , min[4 5,0 5]]} 5, (再 经5) 9
( ( ( l5 3) min{ 5 2 ) , l2 2 ) l ( 2,5), l3 2 ) l (3,5)]}} l(
0 3 3 0 D (1) 1 2 5 6 9 10
1 2 0
5 6 4
4 0 8 12
9 10 8 12 0
0 0 R (1) 0 3 3
wij w w
' is
'' js
10
v1
3
1
6
2
v4
4
0 3 1 6 3 0 2
v6
2
1 2 0 4 8
v2
8 v v3 5
v7 3 1 9 v8
6 4 0 8 0 2 3 9 2 0 5 3 5 0 1
0 0 3 0 0 3 0 0 0 3 0 0
13
5
0 3 1 5 0 3 0 2 6 0 (1) (1) D , R 1 2 0 4 0 5 6 4 0 3 d 35 8, wi 5 wi 3 d 35 2) (
( ( l1( 3) min{ 1( 2 ) , min[l2 2 ) l ( 2,1), l3 2 ) l (3,1)]} l
min{ , min(6 1,13 2)} 4 4
( ( l23) min{ 2 2 ) } l2 2 ) 6, l( ( ( ( l3 3) min{ 3 2 ) , min[l2 2 ) l ( 2,3), l4 2 ) l ( 4,3)]} l(
13 14 12 16 4 6 1 0
w18 13, v1 v7 v8 , v1 v5 v7 , v1 v3 v5 , v1 v3 , v1 v3 v5 v7 v8 ,
R (1)
0 0 0 3 3 5 5 7
8
2.Floyd算法在以下情况可以简化:
(1)如有度数为1的端,可把它们去掉再做计算; 设 v s为度数为1的端,它只与 v i 相连,则 v s 与其它 端的最短径必经 v i ,所以
wsj d si wij (w表最短距离 )
(2)如有度数为2的端,则按下述方法去掉: 设 v s为度数为2的端,它只与 vi 和v j 相连, 若 d sj d si dij ,则可简单地去掉 v s 若 d sj d si dij ,也可去掉v s ,但把 dij 改成 d sj d si ; 9
min{ , min(6 1, 2)} 4, 4
( ( l2 2 ) min{ 21) } l21) 6, (除s外, 无 其 它 到 的 径) l( 2 ( ( ( l3 2 ) min{ 31) , min[l21) l ( 2,3), l41) l ( 4,3)]} l(