3第三章 最短路问题
最短路问题__迪杰斯特拉算法ppt课件
j
)}
min{
T
(v4
),
T
(v5
),
T
(v6
)}
T
(v4
)
T
(v5
)
5,
所以有, p(v4 ) 5, p(v5 ) 5
(6) T (v6 ) min[T (v6 ), P(v4 ) l46, P(v5 ) l56 ] min[, 5 4,5 2] 7
X={1,2,4}, p2=2
ppt课件
13
X={1,2,4}
p1=0
p2=2
2
6
1
2
3
1
10
p4=1
5
9
3
4
7
5
6
5
2
3
4
6
7
4
p6=3
8 8
min {d16,d23,d25,d47}=min {0+3,2+6,2+5,1+2}=min {3,8,7,3}=3
X={1,2,4,6}, p6=3
ppt课件
P(v1) 0
T (vi ) (i 2,3,,6)
(2) T (v2 ) min[ T (v2 ), P(v1) l12 ] min[ , 0 3] 3
T (v3 ) min[ T (v3 ), P(v1 ) l13 ] min[ , 0 5] 5
最短路问题
ppt课件
1
一、问题的提法及应用背景
(1)问题的提法——寻求网络中两点间 的最短路就是寻求连接这两个点的边的 总权数最小的通路。(注意:在有向图 中,通路——开的初等链中所有的弧应 是首尾相连的。)
3第三章最短路问题
现在我们就来构造一个图G,它的顶点就是这10 种情况,G中的边是按照下述原则来连的;如果情况 甲经过一次渡河可以变成情况乙,那么就在情况甲与 乙之间连一条边.
MWSV MWS MWV WSV MS
WV
W
S
V
Ø
例如,MWSV经过一次渡河可以变成WV(人带着羊 过河,左岸留下狼和白菜),又例如MWV经过一次渡河 可以变为W(人带着白菜过河,留下狼),或变为V.当 然反过来,W也可以变为MWV(人带着白菜从右岸返回 左岸).
§3.2 求最短有向路的标号法
这一节介绍一种求有向图上最短有向路的方法 ,叫做标号法。
所谓标号,我们是指与图的每一个顶点对应的一个 数(或几个数).例如设G=(V,A)的顶点集合是V={v1,v2, …,vn},如果我们能使v1对应一个数b(1),v2对应数 b(2),…,vn对应数b(n),那么,这些数b(i)就称为vi的 标号,当然,在不同的问题中,标号b(i)一般代表不同 的意义.
从上面的简单比较久可以看出,为什么说计算 次数是n的多项式的方法是有效的,而计算次数是 n的指数函数的方法是无效的.另外,也可以看出, 单靠提高计算机的速度还不够,还必须从数学上寻 求有效的计算方法.
现在再回过头来看看标号法好不好.回想一下标 号法的各轮计算,可以看出,它只包含两种运算: 加法与比较大小(比较大小也需要花费时间,所以 也要考虑).加法用于计算k(i,j),每计算一个k(i,j)进 行一次加法,而且每一条弧最多只计算一次.因此, 如果图中有m条弧,那么至多进行m次加法.对于一 个有n个顶点的简单有向图来说,最多有n(n-1)条 弧(假设从每一个顶点vi出发,都有n-1条弧指向其 他的n-1个顶点),因此,最多进行n(n-1)次加法, 放宽一点,也可以说,至多进行n2次加法.
《最短路问题》课件
3 最短路问题的历史
渊源
最短路问题最早由荷兰 数学家 Edsger Dijkstra 在 1956 年提出。
最短路问题的定义
图论中的最短路问 题指什么?
在无向连通图或有向连通图 中,从某一起点到其余各顶 点的最短路径。
什么是路径长度?
路径长度是指路径上边或弧 的权值之和。
什么是无环图?
无环图指不存在环的图,可 以用拓扑排序求解最短路。
《最短路问题》PPT课件
欢迎来到最短路问题的世界。在本课件中,我们将介绍四种最短路算法及其 应用,并分析它们的优缺点。
问题背景
1 什么是最短路问题? 2 为什么需要解决最
短路问题?
最短路问题是计算从源 节点到目标节点的最短 路径的问题。它是图论 中的一个经典算法问题。
很多实际问题都涉及到 最短路径的计算,比如 电网、交通、通信等领 域。
Floyd-Warshall算法解决的是所有点对之间 的最短路径问题,可以处理有向图或负边权 图。
Bellman-Ford算法
Bellman-Ford算法解决的是有向图中含有负 权边的单源最短路径问题。
A*算法
A*算法综合了贪心和广度优先搜索,在启发 函数的帮助下,可以高效解决带权图上的单 源最短路径问题。
算法示例
1
Step 1
假设我们要求从 A 点到其他各点的最
Step 2
2
短路径。
首先初始化 A 点到其他各点的距离为
无穷大,A 点到自身的距离为 0。
3
Step 3
找到 A 点的直接邻居,更新其距离值。
Step 4
4
重复 Step 3,直到所有节点的距离值 都已经更新。
总结
最短路问题的求解方法
最短路问题的求解方法最短路问题是图论中的经典问题之一,它在实际生活中有着广泛的应用,比如在交通规划、通信网络、物流配送等领域都有着重要的作用。
在解决最短路问题时,我们需要找到图中两个顶点之间的最短路径,即使得路径上的边的权值之和最小。
针对不同的图,我们可以采用不同的方法来求解最短路问题,下面将介绍几种常见的求解方法。
首先,最简单直接的方法是暴力搜索法。
暴力搜索法适用于小规模的图,它通过穷举所有可能的路径来找到最短路径。
虽然这种方法在理论上是可行的,但是在实际应用中由于时间复杂度过高,通常不适用于大规模的图。
其次,我们可以使用迪杰斯特拉算法来解决最短路问题。
迪杰斯特拉算法是一种贪心算法,它通过逐步扩展离源点距离最短的节点来逐步求解最短路径。
迪杰斯特拉算法的时间复杂度为O(V^2),其中V为顶点数,因此适用于稠密图。
另外,我们还可以使用贝尔曼-福特算法来求解最短路问题。
贝尔曼-福特算法是一种动态规划算法,它通过多次松弛操作来逐步逼近最短路径。
贝尔曼-福特算法适用于存在负权边的图,但是由于其时间复杂度为O(VE),因此在稠密图中效率较低。
最后,我们还可以使用Floyd-Warshall算法来解决最短路问题。
Floyd-Warshall算法是一种动态规划算法,它通过逐步考察所有顶点对之间的路径来求解最短路径。
Floyd-Warshall算法的时间复杂度为O(V^3),因此适用于小规模图。
总的来说,不同的最短路求解方法适用于不同的图,我们需要根据具体的情况来选择合适的方法。
在实际应用中,我们还可以结合启发式算法、并行算法等方法来进一步提高求解效率。
希望本文介绍的内容能够对读者有所帮助,谢谢!。
最短路问题
最短路问题何谓最短路?最短路问题考虑的是有向网络N=(V,A,W),其中弧(i,j)∈A 对应的权又称为弧长或费用。
对于其中的两个顶点s,t∈V,以s 为起点,t 为终点的有向路称为s-t 有向路,其所经过的所有弧上的权(或弧长、费用)之和称为该有向路的权(或弧长、费用)。
所有s-t 有向路中权最小的一条称为s-t 最短路。
ij w 如何得到最短路?最短路问题的线性规划描述如下:(,)m i ni j i j i j A w x ∈∑ (1):(,):(,)1,,..1,,0,,ij ji j i j A j j i A i s s t x x s i s t ∈∈=⎧⎪t −=−=⎨⎪≠⎩∑∑ (2) 0ij x ≥ (3) 其中决策变量表示弧(i,j)是否位于s-t 路上:当=1时,表示弧(i,j)位于s-t 路上,当=0时,表示弧(i,j)不在s-t 路上。
本来,应当是0-1变量,但由于约束(2)的约束矩阵就是网络的关联矩阵,它是全幺模矩阵,因此0-1变量可以松弛为区间[0,1]中的实数(当用单纯形法求解时,将得到0-1整数解)。
ij x ij x ij x ij x 值得注意的是,我们这里将变量直接松弛为所有非负实数。
实际上,如果可以取0-1以外的整数,则约束条件并不能保证对应于非零的弧所构成的结构(记为P)一定是一条路,因为这一结构可能含有圈。
进一步分析,我们总是假设网络本身不含有负圈,而任何正圈不可能使目标函数最小,因此上面的约束条件(2),(3)可以保证当达到最优解时,P 如果包含圈,该圈一定是零圈,我们从P 中去掉所有的零圈,就可以得到最短路。
ij x ij x ij x 无圈网络与正费用网络一般采用标号设定算法。
Bellman 方程(最短路方程)将约束条件(2)两边同时乘以-1,得到其对偶问题为:m ax()t s u u − (4)..,(,)j i ij s t u u w i j A −≤∀∈ (5)根据互补松弛条件,当x 和u 分别为原问题和对偶问题的最优解时:()0,(,i j j i i j )x u u w i j −−=∀∈A (6) 因此,当某弧(i,j)位于最短路上时,即对应的变量>0时,一定有ij x j i i u u w −=j 。
第三节 最短路问题PPT课件
定义: 给定一个赋权有向图,即给了一个有向图
G=(V,A,W) ,对每一个弧aij =(vi,vj)∈A , 相应地有权w(aij ) =wij ∈V1 ,又给定 G中的 两个顶点vs ,vt 。设 P是G 中从vs 到 vt的一条路,
定义路 P的权是 P中所有弧的权之和,记为W(P)
。最短路问题就是要在所有从vs 到vt 的路中,求 一条权最小的路,即求一条从vs 到vt 的路P* ,
Thank You
在别人的演说中思考,在自己的故事里成长
Thinking In Other People‘S Speeches,Growing Up In Your Own Story
讲师:XXXXXX XX年XX月XX日
则resent= vk,
, 。 Sk Sk1 vk
Tk Tk1 vk
若k=n,则结束,否则转第二步。
6
例 用Dijkstra算法求前面例子中从v1到各点的最短路。
v2 1
6 2
v5
2
v9
6
3
v1
3 v3 6
3 4 10
1
2
v4
10
4
v6 2 v7
v8
7
图上标号法:
v2 v1,6 1
v5
v1, ∞ 2
转步骤二。
29
用逐次逼近算法求从V1到V6的最短路
v2
5
4
v1
-3
5
7
v3
v6 v4 6
2
v5
30
写在最后
经常不断地学习,你就什么都知道。你知道得越多,你就越有力量 Study Constantly, And You Will Know Everything. The More
运筹学课件:最短路问题
Operation Research
实例1
第八讲
Operation Research
实例2 求从1出发到5的最大流
第八讲
Operation Research
第八讲
Operation Research
实例
第八讲
Operation Research
第八讲
第八讲
Operation Research
网络最大流的基本概念(6)
增广链的基本概念
第八讲
Operation Research
第八讲
Operation Research
第八讲
Operation Research
实例:寻找图中增广链
第八讲
Operation Research
第八讲
网络最大流的基本概念(7)
直到 D(k-1)=D(k)
dij(k)=min{dir(k-1)+drj(k-1)}
矩阵的计算次数k
Operation Research
实例(1) 求图中任意两点之间的最短ch
第八讲
Operation Research
第八讲
Operation Research
Operation Research
求解步骤
(1)标号过程
第八讲
Operation Research
(2)调整过程
第八讲
我们的目标是尽快找到一条从起点vs到终点vt的增广链, 所以没必要在中途多停留,即对已标号的vi,每次只检查 一个相邻点vj,再给vj标号,没有必要检查vi的所有相邻点, 这样一次可改进一条增广链,只到没有增广链为止
(2)起点发出的流的总和(称为流量),必须等于终点接收的流的总 和;
第三节 最短路问题
作业
195页
习题8
8.4题
( X , X ) { (V1 ,V4 ) ,(V2 ,V4 ) ,(V5 ,V4 ) ,(V5 ,V9 )} 1、 2、K14 K 24 8 K54 5 3 8 K59 1 3 4
3、 (V5 ,V9 ) V9 ( 4 ,
5)
第五轮: V1 (0,0) V2 (2,1) V5 (3,2) V9 (4,5) V7 (7,9) 1、 ( X , X ) { (V1 ,V4 ) ,(V2 ,V4 ) ,(V5 ,V4 ),(V9 ,V6 ),(V9 ,V7 ),(V9 ,V8 )} 2、 K14 K24 K54 8 3、 (V9 ,V7 ) V7 ( 7 ,
V1
(i , i )
V2
5
7
1
V4
6
2 2
V3
1
V5
第三步: 找出第二步中 K ij 最小的那条弧,给它的终 点以标号
(V1 ,V3 ) V3 (2,1)
8
如果有几个 K ij 都取最小值,就同时标号
以后每一轮都重复第二轮的三个步骤, 从而使某个顶点获得标号; 当终点获得标号后,计算结束; 然后逆向追踪获得最短路.
( X , X ) { (V1 ,V4 ) ,(V2 ,V4 ) ,(V5 ,V4 ) ,(V5 ,V9 )} 1、 2、K14 K 24 8 K54 3 5 8 K59 3 1 4
3、 (V5 ,V9 ) V9 ( 4 ,
5)
第三轮: V1 (0,0) V2 (2,1) V5 (3,2)
9)
1)
V4 (8,1) V1 V2 (2,1) V5 (3,2) V9 (4,5) V7 (7,9) V6 (10,9)
最短路问题
(1)求解思路——从始点出发,逐步顺序地向外
探寻,每向外延伸一步都要求是最短的。
(2)使用条件——网络中所有的弧权均非负 (3) 标号法的特点
w ij 0
最短路径上的前点 标号 能得到从 V1(起点)到各点的最短路线和最短路长。 (4)准备工作 : 当前被标号顶点到 起始点的最短路长 将网络中所有顶点分为两个集合P和T,已求出最短 路的点位于P中,其他点置于T中;
给集合P中的点赋予标号 (d,i)
例题:
某地区4个城镇间的公路交通网如图,城镇1有一批货需要运 往城镇4,网络边上的数据为综合运输费用。如何选择路线才 能使总的综合运费最少? V2
4 6
V1
2
1
8
V4
V3
最短路径问题(有向图)1源自1 2 10 4 5 6 4 2 7
2
5
6 9 5 3 8 4
3
3
dij2 = min【dik + djk】(k=1,2,…,n)
1 1 3 5 2 10 7 2 4 3
(2,1)
2 5 6 (6,7) 9
(8,2) 3
(1,1) 4
5
4 8
6
6
(3,1)
7
(3,4)
8
min {c23,c53,c58,c78} = min { 2+6,6+9,6+4,3+8 } = min {8,15,10,11}=8
P = {1,2,3,4,5,6,7}
5 6
4
2 7
3
8
4 8
min {c12,c16,c42,c47}=min {0+2,0+3,1+10,1+2} =min {2,3,11,3}=2 P = {1,2,4}
第3节 最短路问题__运筹学__胡运权__清华大学出版社
0000
v2 6 0
2
-1 -5 -5 -5
v3
-3 0 -5
1
-2 -2 -2 -2
v4 8
0
2
3 -7 -7 -7
v5
-1
0
1 -3 -3
v6
1017
-1 -1 -1
v7
-1
0
5 -5 -5
v8
-3
-5 0
66
最短路算法—Warshall-Flod方法
v2
-1
-5
6
2
-1 -3
0 v1
-2
v3
2 [3, v1]
3
v3 6
12
v4
10
[1, v1]
[6, v2]
v5 2 v9
6 4 10 3
3
v8
v6 2
[10, v5]
4
v7
[9, v5]
[5, v3]
[6, v2]
[0, v1]
v1
16 v22 [3 v1]3v3 6
12
v5 2 v9
6 4 10 3
3 [12, v5]
v8
4
v4
10
v[34,v2/
v4]
5
[8,v5]
v6 5
[0,v1] 3
13
1
7
v4
5
[3,v1]
v5[7,v3]
[13,v6]
v7
[课堂练习] 无向图情形
答案(2):
v2 [2,v1]
v1
2
2
5
7
v[34,v2/
v4]
5
[8,v5]
3最短路问题
)
T
(v4
)
1,
S1 S0 {v4} {v1, v4}, k 4
v1
v2
62 3 v3
1
v5 2
v9
6
6
10
3
3
v1
2
4 v8
4
v4
10
v6 2 v7
1 v4
i 1 : continued
(2) (v4 , v6 ) A且v6 S1
T (v6 ) T (v6 )
M p(v4 ) w46 110 11,
S0 {v1}, P(v1) 0, (v1) 0;T (vi ) ,
(vi ) M (i 2,3,...,9),k 1.
v2
(2)(v1, v2 ) A且v2 S0 6 2
T (v2 ) p(v1) w12 , v1
3 v3 2
同 T理(v2,) P(v1) w12 6,(v2 ) 1; v4
个顶点是vm; * λ(v) =M表示D中不含从vs到v的路; * λ(v) =0 表示v=vs.
2、最短路算法(Dijkstra算法)
(0)初始化:i=0,令S0={vs},P(vs)=0, λ(vs) =0,对 每一个v≠vs,令T(v)=+∞,λ(v) =M;k=s(当前点).
(1)判断:如果Si=V,算法终止。此时,对每个 v∈Si,d(vs,v)=P(v);否则转入(2).
1
v5 2
6
6
10 4 3
4
10
v6 2 v7
T (v3 ) p(v1) w13 T (v3 ) p(v1) w13 3,(v3 ) 1;
T(v4) p(v1) w14 T(v4) p(v1) w14 1,(v4) 1;
最短路问题(课堂PPT)
5
0
5
V2
3
6 5 5 V6
V1 4
7 2
V4 7
1
6
8
V5 4
V3
V7
4
6
(4)找出所有与v1,v2,v3相邻的未标记的点v4,v5,v6,求出
从v1直接到这些点的距离(v1->v4:7)以及经过v2到这些点 的距离(v1->v2->v4:11;v1->v2->v5:10;v1->v2->v6:8)以及 经过v3到这些点的距离(v1->v3->v4:6;v1->v3->v5:12)找出 这些距离中最短的路径为v1->v3->v4,最短距离为L14=6, 将v4标记为6
3 2 4 1
时间
2 3 3 2
25
0
5
V2
3
6 5 5 V6
V1 4
7 2
V4 7
1
6
8
V5 4
V3
V7
4
(2)找出同v1相邻的未标号的点有v2,v3,v4,求出从
v1到其所有相邻点的距离(v1->v2:5;v1->v3:4;v1>v4:7),距离最短路径为v1->v3,最短距离为L13=4, 将v3标记为4
0
5
V2
3
6 5 5 V6
5
0
5
V2
3
6 6 5 5 V6
V1 4
7 2
V4 7
1
6
8
V5 4
V3
V7
4
7
(5)找出所有与v1,v2,v3,v4相邻的未标记的点v5,v6,求出
关于最短路问题课件
V ∞,s
4
1
3
4,s C
4
7
E ∞,s
2,s
A
0
7
2
2
5
54,,sA 5
9∞,,As
D5
S
B
1
V ∞,s
4
1
3
4,s C
4
7
E ∞,s
2,s
A
0
7
2
2
5
54,,sA 5
9∞,,As
D5
S
B
1
V ∞,s
4
1
3
4,s C
4
7
E
8∞,,Cs
2,s
A
0
7
2
2
5
54,,sA 5
9∞,,As
D5
S
B
1
V ∞,s
d (u ) md ( a u ,v ) x v ,{ V { u }}
中心问题
网络G的一个中心是满足下列条件的G的顶点u
d (u ) md i(v n )v , { V }
选址问题可化为求G的中心问题。
(2)
求图的中心的算法过程:
用Dijkstra算法求出G的任意两点间的距离;
求出每点的离距d(v)
如果Pu0uv 是从u 0 到 S 的最短路,
则 u S ,并且P的 (u 0 , u ) 段是最短的
(u 0 , u ) 路,所以 d(u0,u)d(u0,u)w (u,v)
d ( u 0 ,S ) m d ( u 0 i ,u n ) w ( { u ,v )u ,S ,v S } (1)
点到其他所有顶点的最短路;这些最短路构成了图的
图论第3章-树与最短路
② ③ 先证G中无回路。若G中存在某个结点 v上的 自回路, uV ,由条件知 u 到 v 存在一条路 L1 : u…v ,因为 v 上有自回路,所以 u 到 v 存在另一条 路L2:u…vv,这与G中每一对结点之间存在惟一 的路矛盾。若G中存在长度大于等于2的一条回路, 则回路上两个结点之间存在不同的路。这与条件 是矛盾的。所以G中无回路。 以下用归纳法证明m=n–1。 当 n=1 时, G 为平凡图, m=0=1–1=n–1 。结 论成立。 设 n≤k 时,结论成立。下证 n=k+1 时,结论 也成立。
最小生成树 设无向连通带权图G=<V,E,W>,T是G的一 棵生成树,T的各边权之和称为T的权,记作 W(T)。G的所有生成树中权最小的生成树称为 G的最小生成树。 求最小生成树的算法很多,我们只介绍避圈 法(克鲁斯克尔Kruskal算法)。
Kruskal算法 — 一种求最小生成树的算法
设n阶无向连通带权图G=<V,E,W>有m条 边,不妨设G中无环(否则可先删去),算法为: (1) 将m条边按权从小到大顺序排列,设为 e1,e2, … ,em。 (2) 取e1在T中,然后依次检查e2, … ,em ,若ej (j=2,3, …,m)与T中的边不能构成回路,则取ej在T 中,否则放弃ej,考虑下一条边,直至j>m。 (3) 算法停止时得到的T为G的最小生成树。
例: 下图(1)为一棵根树。V0为树根, v1,v4, v3, v6, v7为树
叶, v2, v5为内点, v0, v2, v5为均为分支点, 由于在根树中
③④只须证明 G 是连通的。若不然,设 G 有 t(t≥2) 个连通分支 G1 , G2 , … , Gt , Gi 中均无 回路,都是树。由① ② ③可知, mi=ni–1 , i=1,…,t 。于是 m=m1 + m2 + … + mt =n1-1 + n2-1 + … + nt-1=n1 + n2 + … + nt-t=n–t ,由于 t≥2 ,这 与m=n–1矛盾。所以G是连通图。 ④ ⑤只须证明 G 的每一条边均为桥。设 e 是 G 的 任意 边 ,删 除 e 得子 图 G1 , G1 中 的 边数 m1=m-1,G1中的结点数n1=n,m1=m–1=n-1-1=n2=n1-2<n1-1,所以G1不是连通图,所以e是桥。
最短路问题讲解
最短路问题求解方法
• Dijkstra算法 • 逐步逼近算法 • 路矩阵算法
第5页
求解最短路问题的Dijkstra算法
v5 指定D两ij点ks间tra的算v最法1 短是路Div问j2ks题tra,在或v139从59指年v定4提点出到的其,余可各用点于的求最解短 路问题。由于其以标号为主要特征,又称为标号法。
第2页
最短路问题引例
下图为单行线交通网,每弧旁的数字表示通过这条 线所需的费用。现在某人要从v1出发,通过这个交通 网到v8去,求使总费用最小的旅行路线。
v2 1
v5
2
v9
6 2
6
3
v1
3 v3 6
3 4 10
1
2
v4
10
4
v6 2 v7
v8
第3页
v2 1
v5
2
v9
6 2
6
3
v1
3 v3 6
3 4 10
v7:[3,v4]
第20页
[0,v1]
[2,v1]
2
6
V1
V2
V3
1 [1,v1]10
5 [6,v7] 9
3
V4
7
V5
6
5
2
3
4
V6
V7
V8
4
8
[3,v1]
[3,v4]
(6)A={V1,V2,V4,V6,V7} 考虑边(v2,v3),(v2,v5),(v7,v5),(v7,v8) 计算min {2+6, 2+5, 3+3, 3+8}=min {8,7,6,11}=6
计算 min{0+2, 0+3, 1+10,
最短路问题
17.
}
18.
}
19. }
20.}
二、Floyd算法及求解最小环
• Floyd算法可以求出每对点之间的最短距离,它对于图的要求是,可以是无向图和有
向图,边权可正可负,唯一的要求是不能有负环。
• 设d[i][j][k]表示路径中间只允许经过节点1…k的情况下,i到j的最短路距离。它
有两种情况:
• 最短路经过点k,d[i][j][k]=d[i][k][k-1]+d[k][j][k-1]
13.
d[y] = d[x] + z;
//更新
14.
if (!v[y]) q.push(y), v[y] = 1; //把新的二元组插入队列
15.
}
16.
}
17. }
18.}
【例题2】拯救大兵瑞恩(Hdu4845) 1944年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救
被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了 迷宫的地形图。迷宫的外形是一个长方形,其南北方向被划分为N 行,东西方向被划分 为M列,于是整个迷宫被划分为 N×M 个单元。每一个单元的位置可用一个有序数对(单 元的行号,单元的列号)来表示。南北或东西方向相邻的 2 个单元之间可能互通,也可 能有一扇锁着的门,或者是一堵不可逾越的墙。迷宫中有一些单元存放着钥匙,并且所 有的门被分成 P类,打开同一类的门的钥匙相同,不同类门的钥匙不同。
(u,v)是否满足关系式d[v]> d[u]+ w(u,v)来判断是否存在负权回路。
1.bool bellman(int v0)
2.{ int i,j;
3. for(i=1;i<=nv;i++)d[i]=maxx;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在这一章中,我们假设遇到的图G都是简单图.这 样假设是合理的,因为如果G有平行弧或平行边,例 如有好几条从vi到vj的弧,那么很显然,可以把这些 弧中最短的一条留下,其余的都去掉,然后在剩下的 简单图上再来求从vs到vt的最短有向路.因为G是简单 图,所以每一条弧ak被它的起点vi与终点vj唯一决定, 因此,下面我们就用<vi,vj>或<i,j>来表示一条弧, 用(vi,vj)或(i,j)来表示边,而用l(i,j)来表示弧或 边的长度.
大家也许会认为,这两个例子本来就不很难,把 它转化成图论问题,倒相当麻烦,有什么好处呢?其 实这种做法还是很有好处的.因为在转化前,想解决 这些问题,只能用凑的办法,或者最多是凭经验.而 转化成图论问题以后,就可以用一种系统的方法解决 了.
最后,还要指出一下,求最短有向路和求最短无 向路这两个问题是密切关联的.下面将看到,求最短有 向路的计算方法也可以用来求最短无向路.
例1 渡河问题:一个人带了一只狼、一只羊和一 棵白菜想要过河,河上有一只独木船,每次除了人以外, 只能带一样东西.另外,如果人不在旁时,狼就要吃羊, 羊就要吃白菜.问应该怎样安排渡河,才能做到把所有 东西都带过河去,而且在河上来回的次数又最少.
当然,这个问题不用图论也能解决.大家一眼就 能看出,第一次应该带着羊过河,让狼和白菜留下, 以下怎么渡法呢? 下面就来讲一下怎样把这个问题转化成最短路问 题. 我们用M代表人,W代表狼,S代表羊,V代表白菜. 开始时,设人和其他三样东西都在河的左岸,这种情 况,我们用MWSV来表示.又例如人带了羊渡到河的右 岸去了,这时左岸留下了狼和白菜,这种情况就用WV 来表示.例如MWS表示人(M)狼(W)羊(S)在左岸而白菜 (V)在右岸这种情况.那么总共可能有几种允许的情况 呢
作出了图G以后,渡河问题就归结为下述问题了: “在图G中找一条连接顶点MWSV与Ø,并且包含边 数最少的路”.如果我们设G的每条边的长度都是1,那 么也可以把渡河问题归结为:“找一条连接MWSV与 Ø的最短路”.
例2: 某两人有一只8升的酒壶装满了酒,还有两 只空壶,分别为5升和3升.现要将酒平分,求最少 的操作次数. 解 设x1,x2,x3分别表示8,5,3升酒壶中的酒量.则
§3.2 求最短有向路的标号法
这一节介绍一种求有向图上最短有向路的方
法,叫做标号法。
所谓标号,我们是指与图的每一个顶点对应的一个 数(或几个数).例如设G=(V,A)的顶点集合是V={v1,v2, …,vn},如果我们能使v1对应一个数b(1),v2对应数 b(2),…,vn对应数b(n),那么,这些数b(i)就称为vi的 标号,当然,在不同的问题中,标号b(i)一般代表不同 的意义.
Hale Waihona Puke 上面讲的是怎样比较两种方法谁好谁坏.现在总共只 讲了一个标号法,又怎么评论它的好坏呢?也有办法 的.目前一般认为,如果一种方法所需要的运算次数能 表示成n的多项式,例如n4,2n2+3n等等.这种方法就认 为是好的,或者说是有效的.而如果一种方法的计算次 数是某一个数的n次幂,例如2n,10n,即是n的指数函数 ,这种方法就认为是不好的,或者说是无效的.请看如 下这张表: n 5 10 20 30 50 100 106 ≈1030 1000 109 ≈ 10300
x1 x2 x3 8, x1 8, x2 5, x3 3.
容易算出(x1,x2,x3) 的组合形式共24种.
(0,5,3);(1,5,2);(1,4,3);(2,5,1);(2,4,2);(2,3,3); (3,5,0);(3,4,1);(3,3,2);(3,2,3);(4,4,0);(4,3,1); (4,2,2);(4,1,3);(5,3,0);(5,2,1);(5,1,2);(5,0,3); (6,2,0);(6,1,1);(6,0,2);(7,1,0);(7,0,1);(8,0,0);
每种组合用一个点表示,若点u能通过倒酒的方式变 换为v,则 u向v 连有向边,并将各边赋权1,得一个有向 赋权图. 于是问题转化为在该图中求 (8,0,0)到(4,4,0)的一条最 短路(求最短路的算法在有向图中仍适用).结果如下:
(8, 0, 0) (3,5, 0) (3, 2,3) (6, 2, 0) (6, 0, 2) (1,5,2) (1, 4,3) (4, 4, 0).
方法A(运 625 算次数n3) 方法B(运 32 算次数2n)
1000 8000 27000 625000 1024 ≈106 ≈109 ≈1015
上表中对一种需要进行n3次运算的方法A与另一种需要进 行2n次运算的方法B进行了比较(关于2n的近似值,我们是以 210=1024≈103来估算的,例如250=(210)5≈(103)5=1015).从上表 可以看出,方法B的运算次数的增长速度是惊人的.也许有 的人会认为,现在反正有大型计算机,计算次数多一些无 所谓.其实不然.例如我们有一个每秒能计算一百万次的计 算机,那么,在1000秒内可以进行1000×1000000=109次( 即十亿次)运算,如果用方法A,则则可以解决一个1000个顶 点的问题,而用方法B呢?却只能解决一个30个顶点的问 题.如果想用方法B来解决一个100个顶点的问题,即使用 的是每秒能计算一亿次的计算机,也需要1022秒,即要好 几万亿年.
(如果这个k<i,j>在前面各轮计算中已经算过, 就不必再算)也就是说:k<i,j>等于弧的起点的 标号 加上弧的长度.把算出的k<i,j>的值就写在弧<i,j>的 旁边,并在数的外面加上一个方括号.然后找出使 k<i,j>最小的弧<c,d>(如果有好几条弧都使k<i,j>达 到最小,可任取一条) 步骤3 把弧<c,d>画成粗线,把顶点vd变为已标 号点,令vd的标号b(d)就等于k<c,d>.这一轮计算结 束. 在一轮计算结束后,应该检查一下,是不是所有 顶点都得到标号了,如果是的,那么整个计算就结束 了;如果不是,即还有未标号的顶点,就转向下一轮 计算(即再从步骤1开始计算).
计算结束
否
§3.3 标号法好不好
现在来讨论标号法好不好?要回答这个问题,首 先应该明确一下什么叫“好”,什么叫“不好”.一
般说来,主要的好坏标准是计算起来快不快不快(还
有比的标准,例如容不容易拿上计算机计算;是否
易于普及等等),或者说,用这个方法计算时,需要
进行的运算次数多不多.当然,运算次数越少越好.
第三章 最短路问题
§3.1 什么是最短路问题
让我们先把最短路问题的提法明确一下 1. 求有向图上的最短路问题:设G=(V,A)是一 个有向图,它的每一条弧ai都有一个非负的长度 l(ai).在G中指定了两个顶点vs与vt,要求把从vs到vt 并且长度最小的有向路找出来. 2. 求无向图上的最短(无向)路问题:设 G=(V,E)是一个无向图,它的每一条弧ei都有一个 非负的长度l(ei).在G中指定了两个顶点vs与vt,要 求把连接vs与vt并且长度最小的(无向)路找出来.
回到我们要解决的最短有向路问题上来.为确定 起见,我们设vs=v1,vt=vn,也就是说我们要找的是从 v1到vn的最短有向路.下面介绍的方法可以把从v1到G 的每一个顶点vj的最短有向路都求出来(或者指出不 存在从v1到vj的有向路,即v1不可达vj). 我们把整个计算分成若干“轮”来进行(一个 “轮”就是一个大步),每一轮中,将求出v1到某一 个顶点vj的最短路以及这条最短路的长度b(j).我们 把b(j)就叫做顶点vj的标号.再强调一下,顶点vj的 标号代表的是从v1到vj的最短路的长度.另外,如果 说“顶点vj已经有标号了”或“vj是已标号点”,就 意味着从v1到vj的最短路以及这条最短路的长度都已 经求出来了.
从上面的简单比较久可以看出,为什么说计算 次数是n的多项式的方法是有效的,而计算次数是 n的指数函数的方法是无效的.另外,也可以看出, 单靠提高计算机的速度还不够,还必须从数学上寻 求有效的计算方法. 现在再回过头来看看标号法好不好.回想一下标 号法的各轮计算,可以看出,它只包含两种运算: 加法与比较大小(比较大小也需要花费时间,所以 也要考虑).加法用于计算k(i,j),每计算一个k(i,j)进 行一次加法,而且每一条弧最多只计算一次.因此, 如果图中有m条弧,那么至多进行m次加法.对于一 个有n个顶点的简单有向图来说,最多有n(n-1)条 弧(假设从每一个顶点vi出发,都有n-1条弧指向其 他的n-1个顶点),因此,最多进行n(n-1)次加法, 放宽一点,也可以说,至多进行n2次加法.
如果不管狼是否吃羊、羊是否吃白菜,那么总共 有16中情况,它们分别是:
MWSV, MWS, MWV, MSV, WSV, MW, MV , WS, WV, SV, M, W, S, V, Ø(空集) MS,
例如MS表示人和羊在左岸,而狼和白菜在右岸;Ø表 示左岸是空集,即人、狼、羊、白菜都已渡到右岸去 了.检查一下就可以知道,这16种情况中有6种情况是 不允许出现的.分别是:WSV, MW, MV, WS, SV, M. 例如WSV表示狼、羊、白菜都在左岸而人在右岸,因 为人不在旁边看着,狼就要吃羊,羊也要吃白菜;又如 MV表示人和白菜在左岸,而狼和羊在右岸,当然也是 不行的.因此,允许出现的情况只有10种.
上面两个问题都可以称为最短路问题.很容易看出, 这两个问题都有着大量的生产实际背景.事实上,大至 海、陆、空各种运输,小至一个人每天上班,都会遇到 最短路问题.正因为它用处大,所以近二、三十年来国 内外对这个问题进行了不少研究,也找到了许多比较好 的计算方法. 有趣的是,有些问题,从表面上看与最短路问题没 有什么关系,却可以归结为最短路问题.下面就来举两 个这样的例子:
大家也许会说,运算次数多少不完全决定于采 用什么方法,还和要解决的问题有关.同样用标号 法,解一个只有10个顶点的问题可能只要进行几千 次运算,而解一个100个顶点的问题,就可能要进 行几百万次运算了,这又怎么比较呢? 办法还是有的.那就是,设图G有n个顶点(为了 简单起见,我们就不研究边数m的影响了),我们来 估计一下,把标号法用到图G上去需要进行几次运 算.当然,这样估计出来的结果不会是一个确定的 数,而是象n2,3n3+4n2,2n等等这样的与n有关的数,即 n的函数.然后再以这种函数为标准来比较方法的好 坏.比如说,有两种方法,第一种要进行n3次加法 ,而第二种要进行n5次加法,当然第一种就比第二 种好,因为在n较大时,n5比n3要大多了.