算法12最短路径弗洛伊德Floyd算法课件_第1页
算法12最短路径弗洛伊德Floyd算法课件_第2页
算法12最短路径弗洛伊德Floyd算法课件_第3页
算法12最短路径弗洛伊德Floyd算法课件_第4页
算法12最短路径弗洛伊德Floyd算法课件_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11.问题的提出:已知一个各边权值均大于0的带权有向图,对每一对顶点vi

vj,要求求出vi

与vj之间的最短路径和最短路径长度。2.解决办法方法一:每次以一个顶点为源点,重复执行Dijkstra算法n次——T(n)=O(n³)方法二:弗洛伊德(Floyd)算法11.问题的提出:已知一个各边权值均大于0的带权有向图,对每12求最短路径步骤初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值所有顶点试探完毕,算法结束3.Floyd算法思想:逐个顶点试探法2求最短路径步骤3.Floyd算法思想:逐个顶点试探法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的最短路径。从图的带权邻接矩阵G.arcs出发,假设求顶点Vi到Vj3

2.第二次,再加一个顶点V1,如果(Vi,…,V1)和(V1,…,Vj)分别是当前找到的中间顶点序号不大于0的最短路径,那么(Vi,…,V1,…,Vj)就有可能是从Vi到Vj的中间顶点序号不大于1的最短路径。将它和已经得到的从Vi到Vj之间顶点序号不大于0的最短路径相比较,取较短者为从Vi到Vj的中间顶点序号不大于1的最短路径。

3.第三次,再加一个顶点V2,继续进行试探。

2.第二次,再加一个顶点V1,如果(Vi,…,4V2V3V0V1123456890123012301240092350801608888D(-1)=

D(-1)为有向网的邻接矩阵

第一步:以D(-1)为基础,以V0为中间顶点,求从Vi到Vj的最短路径。该路径或者为从Vi到Vj的边,或者为(Vi,V0)+(V0,Vj)。

D(0)[i][j]=

min{D(-1)[i][j],

D(-1)[i][0]+D(-1)[0][j]}47D(0)=

D(0)[i][j]为从Vi到Vj的中间顶点序号不大于0的最短路径长度.V0V2V3V0V1123456890125V2V3V0V112345689

以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]}0123012301240092350801608888A(-1)=47D(0)=1036D(1)=V0V1V0V1V2V3V0V112345689以D(0)为基础,以V6V2V3V0V112345689

以D(1)为基础,以V2为中间顶点,求从Vi,到Vj的最短路径。或者为从Vi到Vj的边,或者为从Vi开始通过V0,V1,V2到达Vj的最短路径。

D(2)[i][j]=

min{D(1)[i][j],

D(1)[i][2]+D(1)[2][j]}0123012301240092350801608888A(-1)=47A(0)=1036D(1)=D(2)=12

910V0V1V2V2V3V0V112345689以D(1)为基础,以V70123012301240092350801608888A(-1)=47A(0)=1036A(1)=D(2)=12

910D(3)=V2V3V0V112345689

以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]}

9

11

8V3V2V0V1

D(3)[i][j]即为从Vi到Vj的最短路径长度.012300189ACB264311041160230初始:路径:ABACBA

BCCA046602370加入B:路径:ABABCBA

BCCA

CAB0411602370加入A:路径:ABACBA

BCCACAB046502370加入C:路径:AB

ABCBCA

BCCA

CAB例题:9ACB2643110411初始:路径:AB910例ACB264311初始:041160230length=011202300path=加入A:0411602370length=011202310path=加入B:046602370length=012202310path=加入C:046502370length=012302310path=10例ACB264311初始:0411len10114.论点:A(-1)[i][j]是从顶点vi到vj,中间顶点是

v1的最短路径的长度,A(k)[i][j]是从顶点vi到vj,中间顶点的序号不大于k的最短路径的长度,A(n-1)[i][j]是从顶点vi到vj的最短路径长度。证明:归纳证明,始归纳于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时,114.论点:A(-1)[i][j]是从顶点vi1112

ijkA(k-1)[i][k]A(k-1)[k][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)。

12ijkA(k-1)[i][k]A(k-1)[k][1213图用邻接矩阵存储edge[][]存放最短路径长度path[i][j]是从Vi到Vj的最短路径上Vj前一顶点序号5.算法实现voidfloyd(){

for(inti=0;i<n;i++)//矩阵dist与path初始化

for(int

j=0;j<n;j++){//置A(-1)dist[i][j]=Edge[i][j];

path[i][j]=-1;}//初始不经过任何顶点

for(intk=0;k<n;k++)//产生dist(k)及path(k)for(i=0;i<n;i++) for(j=0;j<n;j++)if(dist[i][k]+dist[k][j]<dist[i][j]){

dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=k;}//缩短路径,绕过k到j

}//floyd

13图用邻接矩阵存储5.算法实现voidfloyd(13146.算法分析:设最内层循环体为基本操作,算法有三层循环,每层循环n次,所以T(n)=O(n3)

146.算法分析:14151515结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。WhenYouDoYourBest,FailureIsGreat,SoDon'TGiveUp,StickToTheEnd结束语16感谢聆听不足之处请大家批评指导PleaseCriticizeAndGuideTheShortcomings演讲人:XXXXXX时间:XX年XX月XX日

感谢聆听演讲人:XXXXXX时间:XX年17181.问题的提出:已知一个各边权值均大于0的带权有向图,对每一对顶点vi

vj,要求求出vi

与vj之间的最短路径和最短路径长度。2.解决办法方法一:每次以一个顶点为源点,重复执行Dijkstra算法n次——T(n)=O(n³)方法二:弗洛伊德(Floyd)算法11.问题的提出:已知一个各边权值均大于0的带权有向图,对每1819求最短路径步骤初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值所有顶点试探完毕,算法结束3.Floyd算法思想:逐个顶点试探法2求最短路径步骤3.Floyd算法思想:逐个顶点试探法19从图的带权邻接矩阵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的最短路径。从图的带权邻接矩阵G.arcs出发,假设求顶点Vi到Vj20

2.第二次,再加一个顶点V1,如果(Vi,…,V1)和(V1,…,Vj)分别是当前找到的中间顶点序号不大于0的最短路径,那么(Vi,…,V1,…,Vj)就有可能是从Vi到Vj的中间顶点序号不大于1的最短路径。将它和已经得到的从Vi到Vj之间顶点序号不大于0的最短路径相比较,取较短者为从Vi到Vj的中间顶点序号不大于1的最短路径。

3.第三次,再加一个顶点V2,继续进行试探。

2.第二次,再加一个顶点V1,如果(Vi,…,21V2V3V0V1123456890123012301240092350801608888D(-1)=

D(-1)为有向网的邻接矩阵

第一步:以D(-1)为基础,以V0为中间顶点,求从Vi到Vj的最短路径。该路径或者为从Vi到Vj的边,或者为(Vi,V0)+(V0,Vj)。

D(0)[i][j]=

min{D(-1)[i][j],

D(-1)[i][0]+D(-1)[0][j]}47D(0)=

D(0)[i][j]为从Vi到Vj的中间顶点序号不大于0的最短路径长度.V0V2V3V0V11234568901222V2V3V0V112345689

以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]}0123012301240092350801608888A(-1)=47D(0)=1036D(1)=V0V1V0V1V2V3V0V112345689以D(0)为基础,以V23V2V3V0V112345689

以D(1)为基础,以V2为中间顶点,求从Vi,到Vj的最短路径。或者为从Vi到Vj的边,或者为从Vi开始通过V0,V1,V2到达Vj的最短路径。

D(2)[i][j]=

min{D(1)[i][j],

D(1)[i][2]+D(1)[2][j]}0123012301240092350801608888A(-1)=47A(0)=1036D(1)=D(2)=12

910V0V1V2V2V3V0V112345689以D(1)为基础,以V240123012301240092350801608888A(-1)=47A(0)=1036A(1)=D(2)=12

910D(3)=V2V3V0V112345689

以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]}

9

11

8V3V2V0V1

D(3)[i][j]即为从Vi到Vj的最短路径长度.01230012526ACB264311041160230初始:路径:ABACBA

BCCA046602370加入B:路径:ABABCBA

BCCA

CAB0411602370加入A:路径:ABACBA

BCCACAB046502370加入C:路径:AB

ABCBCA

BCCA

CAB例题:9ACB2643110411初始:路径:AB2627例ACB264311初始:041160230length=011202300path=加入A:0411602370length=011202310path=加入B:046602370length=012202310path=加入C:046502370length=012302310path=10例ACB264311初始:0411len27284.论点:A(-1)[i][j]是从顶点vi到vj,中间顶点是

v1的最短路径的长度,A(k)[i][j]是从顶点vi到vj,中间顶点的序号不大于k的最短路径的长度,A(n-1)[i][j]是从顶点vi到vj的最短路径长度。证明:归纳证明,始归纳于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时,114.论点:A(-1)[i][j]是从顶点vi2829

ijkA(k-1)[i][k]A(k-1)[k][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)。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论