图论4最短路问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 边上的权表示一站 2. 边上的权代表距离 3. 边的权代表费用
7.4 最短路问题
❖ Dijkstra算法 ❖ Floyd算法 ❖ Floyd-Warshall算法
7.4 最短路问题
❖ Dijkstra算法
• Dijkstra算法是由荷兰计算机科学家狄克斯特拉( Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法。是 从一个顶点到其余各顶点的最短路径算法,解决的是有向图 中最短路径问题。 • 荷兰计算机科学教授Edsger W.Dijkstra(1930-) 在1972 年获得美国计算机协会授予的图灵奖,这是计算机科学中最 具声望的奖项之一。 • Dijkstra算法是求出一个连通加权简单图中从结点a到结 点z的最短路。边(i,j)的权ω(i,j)>0,且结点x的标号为L(x)。 结束时,L(z)是从a到z的最短长度。 • 举例来说,如果图中的顶点表示城市,而边上的权重表 示城市间开车行经的距离。 Dijkstra算法可以用来找到两个 城市之间的最短路径。
图论4最短路问题
7.4 最短路问题
❖ 路径
➢ 路径长度
非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和
[距离矩阵] 对上述网络,定义 D=(dij)nn,n=|V| wij 当<vi, vj> E
dij = 其它
[带权路径长度] 对上述网络,路径 v1, v2 , … ,vk
的带权路径长度定义为
7.4 最短路问题
最短路问题在实际工作中应用
•1、通讯网络中最可靠问题 •2、最大容量问题 •3、统筹方法中求关键路线 •4、背包问题 •5、选址问题 •6、工件加工顺序问题 •7、中国邮递员问题 •背包问题(Knapsack problem)是一种组合优化的NP完全问题。 问题可以描述为:给定一组物品,每种物品都有自己的重量和价 格,在限定的总重量内,我们如何选择,才能使得物品的总价格 最高。问题的名称来源于如何选择最合适的物品放置于给定背包 中。
7.4 .1 Dijkstra算法
procedure Dijkstra(G:所有权都为正数的加权连通简单图)
{G带∞}有顶点a=v0,v1,…,vn=z和权ω(vi,vj),若(vi,vj)不是G的边,则ω(vi,vj)=
for i:=1 to n
L(vi)=∞
•dij
L(a):=0
S:= (初始化标记,a的标记为0,其余结点标记为∞,S是空集}
7.4 .1 Dijkstra算法
Dijkstra算法基本思想:把图中所有结点分为两组, 每一个结点对应一个距离值。
❖ 第一组:包括已确定最短路径的结点,结点对应 的距离值是由v0到此结点的最短路径长度;
❖ 第二组:包括尚未确定最短路径的结点,结点对 应的距离值是v0经由第一组结点(中间结点)至 此结点的最短路径长度。
while z S
begin
u:=不属于S的L(u)最小的一个顶点 S:=S∪{u}
for 所有不属于S的顶点v if L(u)+ω(u,v)<L(v) then L(v):=L(u)+ω(u,v)
{这样就给S中添加带最小标记的顶点并且更新不在S中的顶点的标记} end{L(z)=从a到z的最短长度}
7.4 .1 Dijkstra算法
❖ 下面给出该算法的框图:
•通过框图,容易计算该算法计算量

7.4 .1 Dijkstra算法
下面通过一个实例来说明Dijkstra算法是如何工作的。
•∞
7.4 .1 Dijkstra算法

•1
7.4 .1 Dijkstra算法
•b
•5
•4
•8 •a
•2
Βιβλιοθήκη Baidu
•d •6
❖ 按最短路径长度递增的顺序把第二组的结点加到 第一组中去,直至v0可达的所有结点都包含于第 一组。在这个过程中,总保持从v0到第一组各结 点的最短路径长度都不大于从v0至第二组任何结 点的路径长度。
7.4 .1 Dijkstra算法
设源点为v0 ❖ 初始时v0进入第一组,v0的距离值为0;第二组包含其它所有结点
,这些结点对应的距离值这样确定(设vi为第二组中的结点)
❖ 然后每次从第二组的结点中选一个其距离值为最小的结点vm加到 第一组中。每往第一组加入一个结点vm,就要对第二组的各结点 的距离值作一次修正(设vi为第二组的结点):
❖ 若加进vm做中间结点使得v0至vi的路径长度更短(即vi的距离值 >vm的距离值+Wmi),则要修改vi的距离(vi的距离值←vm的距离 值+Wmi)。修改后再选距离值最小的一个结点加入到第一组中, …。 如此进行下去,直至第一组囊括图的所有结点或再无可加 入第一组的结点存在。显然,这种从第二组的结点中选距离值最 小的结点扩展是一种贪心策略。
7.4 最短路问题
❖ 例一位旅客要从A城到B城
1. 他希望选择一条途中中转次数最少的路线; 2. 他希望选择一条途中所花时间最短的路线; 3. 他希望选择一条途中费用最小的路线;
•这些问题均是带权图上的最短路径问题
。•
•v5 •6
100
•v0
30 0 •v4
•10
•1 •2
00
•v1
• 5
5 •v3 •v2 0
•z •3
•c
•1
•e
•用Dijkstra算法0求a和z之间最短
路所用的步骤。
7.4 .1 Dijkstra算法
❖ Dijkstra算法(另外一种说明)
• 求有向网络 G=(V, A) 中结点v1 到其它结点的最短距离 。 • 设D为G的距离矩阵,n=|V|,向量U=(u1, u2, …, un)的 ui 标记结点v1到vi 的距离。 • S为已取得最短路的结点集合,其中每个结点在U中有 固定标号标记取得的最短路的长度;S为未取得最短路的结 点集合,其中每个结点在U中有临时标号。
7.4 .1 Dijkstra算法
0. 初始化:u1(1) 0,uj(1) d1j ( j =2,3,…,n) S(1) {v1},S(1) {v2 , v3 , … , vn},m=1;
1. 选固定标号:在S(m)中求vk,使得 uk(m) =min{uj(m) | vjS(m)}。 若 uk(m) =,则S(m)中的结点无最短路径; 否则转2。
相关文档
最新文档