数据结构:最短路径算法.ppt

上传人:b****1 文档编号:1772837 上传时间:2022-10-24 格式:PPT 页数:81 大小:492KB
下载 相关 举报
数据结构:最短路径算法.ppt_第1页
第1页 / 共81页
数据结构:最短路径算法.ppt_第2页
第2页 / 共81页
数据结构:最短路径算法.ppt_第3页
第3页 / 共81页
数据结构:最短路径算法.ppt_第4页
第4页 / 共81页
数据结构:最短路径算法.ppt_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

数据结构:最短路径算法.ppt

《数据结构:最短路径算法.ppt》由会员分享,可在线阅读,更多相关《数据结构:最短路径算法.ppt(81页珍藏版)》请在冰豆网上搜索。

数据结构:最短路径算法.ppt

图算法

(二)图算法

(二)最短路经最短路经ShortestPath福州大学数学与计算机科学学院陈晓云问题问题:

1.1.两地之间是否有通路两地之间是否有通路?

2.2.若存在多条通路,哪条路最短?

若存在多条通路,哪条路最短?

最短路径问题最短路径问题单源最短路径单源最短路径Single-SourceShortestPath(Dijkstra算法算法)所有顶点对间的最短路径问题所有顶点对间的最短路径问题All-PairsShortestpaths(Floyd算法)算法)最短路径问题最短路径问题单源最短路径单源最短路径Single-SourceShortestPath问题问题:

带权有向图带权有向图G(E,V),找出从给定找出从给定源源顶点顶点s到到其它顶点其它顶点v的权最小路径。

的权最小路径。

“最短路径最短路径”=最小权最小权路径的权是路径上所有边的权之和。

路径的权是路径上所有边的权之和。

例:

道路图例:

道路图:

从福州大学到东街口的最短路径从福州大学到东街口的最短路径?

v5v4v01005601010v1v2v3205030图中从图中从v0到其余各顶点之间的最短路径到其余各顶点之间的最短路径:

v0到到v1无无v0到到v2(v0,v2)10v0到到v3(v0,v4,v3)50v0到到v4(v0,v4)30v0到到v5(v0,v4,v3,v5)60单源最短路径单源最短路径贪心算法:

贪心算法:

若顶点序若顶点序列列V0,V1,Vn是从是从V0到到Vn的最短路,则序列的最短路,则序列V0,V1,Vn-1必必为从为从V0到到Vn-1的最短路。

的最短路。

权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)基本思想:

基本思想:

将图中所有顶点分成两组将图中所有顶点分成两组:

S,V-S一组是包括已确定最短路径的顶点的集合一组是包括已确定最短路径的顶点的集合SS,另一组是尚未确定的最短路径的顶点集另一组是尚未确定的最短路径的顶点集V-SV-S。

SS初始仅初始仅包含源包含源vv00,不断在不断在V-SV-S做贪心选择扩充集做贪心选择扩充集合合SS。

权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)初始时初始时,S仅包含源仅包含源v0,特殊路径:

特殊路径:

从源到从源到G中某一顶点中某一顶点u且中间只经过且中间只经过SS中中顶点的路称为从源到顶点的路称为从源到u的的特殊路径特殊路径。

步骤步骤:

(1)取取v0加入加入S中中

(2)从从V-S中取出具有当前最短路径长度的中取出具有当前最短路径长度的顶点顶点w加入加入S中。

中。

v5v4v0100601010v1v3205030v2v0v1v2v3v4v5v0v1v2v3v4v5权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)邻接矩阵邻接矩阵v0到其它各点的最短路到其它各点的最短路目标点目标点i=1i=2i=3i=4i=5v1无无v210(v0,v2)v360(v0,v2,v3)50(v0,v4,v3)v430(v0,v4)30(v0,v4)v5100(v0,v5)100(v0,v5)90(v0,v4,v5)60(v0,v4,v3,v5)Sv0,v2v0,v2,v4v0,v2,v4,v3v0,v2,v4,v3,v5Dijkstra算法:

算法:

一般情况下,一般情况下,Distk=或者或者=+设置辅助数组设置辅助数组Dist,其中每个分量其中每个分量Disti表表示示当前所求得的从源点到其余各顶点当前所求得的从源点到其余各顶点i的最短路的最短路径的长度。

径的长度。

1)在所有从源点出发的弧中选取一条权值最小的弧,)在所有从源点出发的弧中选取一条权值最小的弧,即为第一条最短路径。

即为第一条最短路径。

2)修改其它各顶点的)修改其它各顶点的Disti值。

值。

假设求得最短路径的顶点为假设求得最短路径的顶点为u,若若Distu+G.arcsuiDisti则将则将Disti改为改为Distu+G.arcsuiV0和和i之间存在弧之间存在弧V0和和i之间不存在弧之间不存在弧其中的最小值即为最短路径的长度。

其中的最小值即为最短路径的长度。

ConstP133maxvalue=99999.0maxlength=100;TypeArr1=array1.maxlengthofinteger;Arr2=array1.maxlength,1.maxlengthofreal;Arr3=array1.maxlengthofreal;Varprev:

Arr1;c:

Arr2;dist:

Arr3;s:

array1.maxlengthofbooleann:

integer;邻接矩阵,邻接矩阵,ci,jci,j为权为权distidisti当前从源到顶点当前从源到顶点ii的最短特殊路径长度(仅经的最短特殊路径长度(仅经过过SS中点)中点)到该顶点最短路径长度到该顶点最短路径长度已知的顶点集已知的顶点集SS权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)Procedureshortpaths(n,v:

integer);单源最短路径问题的单源最短路径问题的DigkstraDigkstra算法算法Vari,j,u:

integer;temp,newdist:

real;beginfori:

=1tondobegindisti:

=cv,i;si:

=false;if(disti=maxvalue)thenprevi:

=0elseprevi:

=v;end;Distv:

=0;sv:

=true;BCDA1043215Ex:

runthealgorithmv到到i的当前最短路径长度的当前最短路径长度初始化初始化权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)源源v加入到加入到Sprev记录记录i当前最短路的前当前最短路的前一个顶点一个顶点Fori:

=1ton-1dobegintemp:

=maxvalue;u:

=v;forj:

=1tondoif(notsj)and(distjtemp)thenbeginu:

=j;temp:

=distj;end;su:

=true;Temp变量中保存的是什么值变量中保存的是什么值?

从未加入从未加入SS中的顶点中的顶点中选取当前特殊距中选取当前特殊距离最短的顶点加入离最短的顶点加入SS权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)时间复杂度时间复杂度:

O(n:

O(n22)Forj:

=1tondoif(notsj)and(cu,jmaxvalue)thenbeginnewdist:

=distu+cu,j;if(newdistdistj)thenbegindistj:

=newdist;prevj:

=u;endendendend;放松步放松步/放松步放松步uu是新加入是新加入SS的顶点的顶点,计算计算uu的所有相邻顶点的特殊距的所有相邻顶点的特殊距离。

若比原距离小,则用新距离离。

若比原距离小,则用新距离代替,并让代替,并让uu做为最短路径上的做为最短路径上的点点权非负的单源最短路径算法权非负的单源最短路径算法(Dijkstra)23411043215Ex:

runthealgorithmSudist2dist3dist41-105maxvalue1,339561,3,448561,3,4,22856IfDistu+cu,jdistjthendistj=distu+cu,jprevj=u权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)基于邻接表的算法(当图边数远小于基于邻接表的算法(当图边数远小于|V|2时采用)时采用)P136Constmaxint=2147483647maxlength=1000Typepointer=adjnode;/邻接表adjnode=recordv:

integer;/顶点标号w:

integer;/权next:

pointer;/指向下一邻接点指针end;Arr1=array1.maxlengthoflongint;Arr2=array1.maxlengthofinteger;Arr3=array1.maxlengthofpointer;Vardist:

Arr1;/特殊距离prev:

Arr2;/i的前一节点adj:

Arr3;/邻接表from,tto,n,e:

integer;/源,目标,节点数,边数FunctionDeleteMin:

integer;/取当前负距离最大(正距离最小)的顶点Vari,k:

integer;temp:

longint;begink:

=0;temp:

=-maxint;fori:

=1tondoif(distitemp)thenbegintemp:

=disti;k:

=i;end;DeleteMin:

=k;End;权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)负距离最大,负距离最大,正距离则最小正距离则最小Functionshortpath(from,tto:

integer):

boolean;Vari,k:

integer;p:

pointer;empty:

boolean;beginfori:

=1tondobegindisti:

=-maxint;previ:

=0;end;k:

=from;/源点distk:

=0;/源点距离empty:

=false;权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)初始化当前距离为某一较小负整数初始化当前距离为某一较小负整数,disti0表示表示iS,省略数组省略数组SS节点节点ii加入加入SS后,后,distidisti=-=-distidisti,变为正距离。

变为正距离。

while(notempty)do还有顶点未被加入还有顶点未被加入S或未到目标顶点或未到目标顶点Beginp:

=adjk;while(pnil)dobeginif(distp.v0)and(distp,v-(dsitk+P.w)thenbegindistp.v:

=-(distk+p.w);prevp.v:

=k;end;p:

=p.next;End;权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)KK的第一个邻接点的第一个邻接点PP放松步放松步KK的下一个邻接点的下一个邻接点逐一考察逐一考察KK的所有邻接点,执行放松步的所有邻接点,执行放松步未加入未加入SSk:

=deletemin;/取当前负距离最大(正距离最小)点作为取当前负距离最大(正距离最小)点作为SS中的点,中的点,If(k=0)or(k=tto)thenempty:

=true;/找不到当前特殊路径距离找不到当前特殊路径距离更小的顶点更小的顶点或到到目标节点或到到目标节点distk:

=-distk;/kk加入加入SSEnd;Shortpath:

=(k=tto);End;权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)23411043215Ex:

runthealgorithmkdist2dist3dist41-10-5-maxint3-95-64-8562856IfDistu+cu,idistithendisti=-(distu+cu,i)previ=uDeleteMin放松步放松步empty:

=true;权非负的单源最短路径算法(权非负的单源最短路径算法(Dijkstra)有向无环图最短路径有向无环图最短路径Dire

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1