优选算法最短路径弗洛伊德Floyd算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
优选算法最短路径弗洛伊德 Floyd算法
3. Floyd算法思想:逐个顶点试探法
–求最短路径步骤 •初始时设置一个n阶方阵,令其对角线元素为0 ,若存在弧<Vi,Vj>,则对应元素为权值;否则 为 •逐步试着在原直接路径中增加中间顶点,若加 入中间点后路径变短,则修改之;否则,维持 原值 •所有顶点试探完毕,算法结束
12
5.算法实现
• 图用邻接矩阵存储 • edge[ ][ ]存放最短路径长度 • path[i][j]是从Vi到Vj的最短路径上Vj前一顶点序号
void floyd ( ){
1
以D(2)为基础,以V3为中间顶点,求从Vi,到Vj的最短
路径。或者为从Vi到Vj的边, 或者为从Vi开始通过 V0,V1, V2,V3到达Vj的最短路径 。
D(3) [i][j] = min{D(2) [i][j], D(2) [i][3]+D(2) [3][j]}
D(3) [i][j] 即为从Vi到Vj的最短路径长度.
2. 第二次,再加一个顶点V1,如果(Vi, … , V1) 和(V1, … , Vj)分别是当前找到的中间顶点序号不 大于0的最短路径,那么(Vi, … , V1, … , Vj )就有 可能是从Vi到Vj的中间顶点序号不大于1的最短路 径。将它和已经得到的从Vi到Vj之间顶点序号不大 于0的最短路径相比较,取较短者为从Vi到Vj的中 间顶点序号不大于1的最短路径。
路径: BCA
BC
CA CAB
9

6
A4B
11
3
2
C
初始: length=
0 4 11 60 2 3 0
加入A: length=
0 4 11 60 2 3 70
加入B: length=
046 602 370
path=
011 202 300
path=
011 202 310
path=
012 202 3 10
2
从图的带权邻接矩阵G.arcs出发,假设求顶点 Vi到Vj的最短路径。如果从Vi到Vj有弧,则从Vi 到Vj存在一条长度为G.arcs[i][j]的路径,但该路 径是否一定是最短路径,还需要进行n次试探。
1.第一次,判别( Vi, V0 )和( V0,Vj ),即判别 (Vi, V0 , Vj)是否存在,若存在,则比较( Vi, Vj )和 (Vi, V0 , Vj)的长度,取长度较短的为从Vi到Vj的中间 顶点序号不大于0的最短路径。
V2 8 V3
8
0 1 120 43 0
3
4 52
ADA(((-1201)))==
8
102 0 9 2 3 45 0 687
1 2
9
V0
V1
8
8
90 110 6 0 3
1
以D(1)为基础,以V2为中间顶点,求从Vi,到Vj的最短
路径。或者为从Vi到Vj的边, 或者为从Vi开始通过 V0,V1, V2到达Vj的最短路径 。
1 2
9
V0
V1
8
8
0160 3
1
以D(0)为基础,以V1为中间顶点,求从Vi,到Vj的最短
路径。该路径或者为从Vi到Vj的边, 或者为从Vi开始通 过V0或V1到达Vj的最短路径 。
D(1) [i][j] = min{D(0) [i][j], D(0) [i][1]+D(0) [1][j]}
6
0123
D(2) [i][j] = min{D(1) [i][j], D(1) [i][2]+D(1) [2][j]}
6
0123
V2 8 V3
8
0 1 1920 43 0
3
4 52
ADA(((-32101)))==
8
11021 0 98 2 3 45 0 687
1 2
9
V0
V1
8
8
90 110 6 0 3
证明:归纳证明,始归纳于s (上角标);
(1) 归纳基础:当s=-1 时, A(-1) [i][j]= Edge[i][j], vi 到vj , 不经过任何顶点的边,是最短路径。
(2)归纳假设:当s<k时, A(s) [i][j]是从顶点vi 到vj ,
中间顶点的序号不大于s的最短路径的长度; (3)当s=k时,
D(0) [i][j] = min{D(-1) [i][j], D(-1) [i][0]+D(-1) [0][j]}
D(0) [i][j] 为从Vi到Vj的中间顶点序号不大于0的最短路径长度.
6
0123
V2 8 V3
8
0 1 120 43 0
3
4 52
AD(((-101)))==
8
0092 3 45 0 687
3. 第三次,再加一个顶点V2,继续进行试探。
6 V2 8 V3
8
0123 0124 0
3
4 5
2
D(0-1Hale Waihona Puke Baidu )==
8
0092 3 45 0 87
1 2
9
V0
V1
8
8
0160 3
1
D(-1)为有向网的邻接矩阵 第一步:以D(-1)为基础,以V0为中间顶点,求从Vi到 Vj的最短路径。该路径或者为从Vi到Vj的边, 或者为 (Vi,V0)+(V0,Vj) 。
例题:
6 A4 3 11
C
初始:
0 6
4 0
11 2
3 0 B
路径: BA CA
AB AC BC
2 0 4 11
加入A: 6 0 2 37 0
AB AC
路径: BA
BC
CA CAB
04 6 加入B: 6 0 2
37 0
AB ABC
路径: BA
BC
CA CAB
04 6 加入C: 5 0 2
37 0
AB ABC
加入C: length=
046 502 3 70
path=
012 30 2 310
10
4. 论点:A(-1) [i][j]是从顶点vi 到vj , 中间顶点是 v1的最短路径的长度,A(k) [i][j]是从顶点vi 到vj , 中间顶点的序号不大于k的最短路径的长度, A(n-1)[i][j]是从顶点vi 到vj 的最短路径长度。
11
A(k-1) [i][k]
k
A(k-1) [k][j]
i
j
A(k-1) [i][j]
因为:A(k) [i][j] = min { A(k-1)[i][j], A(k-1)[i][k] + A(k-1)[k][j] }
由归纳假设知:
A(k-1)[i][j] :是i到j的最短路径(标号不高于k-1); A(k-1)[i][k] :是i到k的最短路径(标号不高于k-1); A(k-1)[k][j] :是k到j的最短路径(标号不高于k-1); 所以: A(k) [i][j] 是i到j的最短路径(标号不高于k)。
相关文档
最新文档