图的最短路径课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《图的最短路径课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 路径 课件
- 资源描述:
-
1、最最 短短 路路 径径一、最短路径一、最短路径 从一个顶点到另一个顶点最短路径长度,称为最短路从一个顶点到另一个顶点最短路径长度,称为最短路径。径。从源点从源点ViVi到终点到终点VjVj的每条路径上的权(的每条路径上的权(它等于它等于该路径上所经边上的权值之和,称为该路径的带该路径上所经边上的权值之和,称为该路径的带权路径长度)权路径长度)可能不同,我们把权值最小的那条可能不同,我们把权值最小的那条路径称为最短路径。路径称为最短路径。例如:图中例如:图中V1V1到到V5V5共有三条路径:共有三条路径:(v1,v5),(v1,v2,v3,v5),(v1,v2,v4,v5),(v1,v5),(v
2、1,v2,v3,v5),(v1,v2,v4,v5),其带权其带权路径长度分别为路径长度分别为3030,2323和和3838,其最短路径为,其最短路径为2323。二、从一个顶点到其余各顶点的最短路径二、从一个顶点到其余各顶点的最短路径 1、算法的基本思想:广度优先遍历方法。、算法的基本思想:广度优先遍历方法。最短路径是指由最短路径是指由n个顶点个顶点e条边组成的图条边组成的图G,从,从某个顶点某个顶点Vi出发,到另一个顶点出发,到另一个顶点Vj的最短路径。的最短路径。它可能是直达路径也可能是经过它可能是直达路径也可能是经过K个点所形成的个点所形成的最短路径。最短路径。例题例题1 如图所示如图所示
3、6个城市之间道路联系图,编一个程序由个城市之间道路联系图,编一个程序由计算机找到从计算机找到从C1城市到城市到C6城市之间长度尽可能短的一条城市之间长度尽可能短的一条路径以及路径总长度。路径以及路径总长度。用广度优先的遍历方法求解最短路径:用广度优先的遍历方法求解最短路径:(1)用邻接矩阵存储图的结构)用邻接矩阵存储图的结构(2)用广度优先的队列存储访问的顶点:)用广度优先的队列存储访问的顶点:(3)记录访问过的城市)记录访问过的城市是一种搜索算法,以便找到最短的路径是一种搜索算法,以便找到最短的路径问题求解的基本方法:广度优先算法问题求解的基本方法:广度优先算法(1)存储该图中顶点之间的关系
4、和路径长度)存储该图中顶点之间的关系和路径长度(2)从起点开始搜索,将访问点入队,并记录已经被)从起点开始搜索,将访问点入队,并记录已经被访问过的城市。在搜索中注意本问题中,最先找到的路访问过的城市。在搜索中注意本问题中,最先找到的路径未必是最短路径,只是走过城市最少的路径。径未必是最短路径,只是走过城市最少的路径。(3)判断当前的路径是否是最短路径)判断当前的路径是否是最短路径(4)输出最短路径的长度及所访问的过程)输出最短路径的长度及所访问的过程程序说明如下:程序说明如下:program short;const m=6;max=32767;link:array1.m,1.m of inte
5、ger=(0,4,8,0,0,0),(4,0,3,4,6,0),(8,3,0,2,2,0),(0,4,2,0,4,9),(0,6,2,4,0,4),(0,0,0,9,4,0);type fg=set of 1.m;var city,pnt:array1.100 of byte ;flag:array1.100 of fg;flags:fg;i,k,n,r,f:integer;path:array1.10 of 1.m;min,step:integer;procedure work;var n,i,y,cost:integer;s:array1.10 of 1.m;begin y:=f;n:=0
6、;cost:=0 ;while y0 do begin inc(n);sn:=y;y:=pnty;end;for i:=n-1 downto 1 do cost:=cost+linkcitysi+1,citysi;if cost,pathi);writeln;writeln(min=,min);end;begin min:=max;flag1:=1;city1:=1;n:=0;pnt1:=0;r:=1;f:=0;repeat inc(f);k:=cityf;if km then begin flags:=flagf;for j:=2 to m do if (not(j in flags)and
7、(linkk,j0)then begin inc(r);cityr:=j;flagr:=flags+j;pntr:=f;if f=m then work ;end;end;until f=r ;print;readln;end.1 Dijktra 算法:荻(杰)克斯特拉算法:荻(杰)克斯特拉(1)从源点从源点Vi到其余每个顶点的最短路径的升到其余每个顶点的最短路径的升序依次求出从源点到各顶点最短路径长度。序依次求出从源点到各顶点最短路径长度。(2)每次求出从源点)每次求出从源点Vi到一个终点到一个终点Vj的最短路径的最短路径后,要以后,要以Vj作为新考虑的中间点,用作为新考虑的中间点,用Vi到
8、到Vj的最的最短路径长度和短路径长度和Vi到其它尚未求出最短路径的那些到其它尚未求出最短路径的那些终点的当前最短路径长度进行比较、修改,使它终点的当前最短路径长度进行比较、修改,使它成为当前新的最短路径长度,当进行成为当前新的最短路径长度,当进行n-2次后算次后算法结束。法结束。如图所示:如图所示:(1)设置一个集合数组)设置一个集合数组S,作用是标记已经求得最短路,作用是标记已经求得最短路径的终点号,初始值只有一个源点,每找到一个最短路径径的终点号,初始值只有一个源点,每找到一个最短路径的终点,将该终点并入的终点,将该终点并入S集合中,以便作为新的中间点。集合中,以便作为新的中间点。若选取为
9、若选取为1否则为否则为0(2)设置数组)设置数组dist,该数组的第,该数组的第j个元素个元素distj用来保用来保存从源点存从源点Vi到到Vj的目前最短边的路径长度。的目前最短边的路径长度。(3 3)设置)设置pathpath为集合数组,存放最短路径经过的顶点集为集合数组,存放最短路径经过的顶点集合。对于前面图的结构,假设从合。对于前面图的结构,假设从V1V1出发到各个顶点的最短出发到各个顶点的最短路径,其开始数组路径,其开始数组S S,DISTDIST,PATHPATH的值如下:的值如下:100000330V1V1,V2V1,V5 S DISTPATH 1 2 3 4 5 1 2 3 4
10、5 第一次遍历:第一次遍历:1 2 3 4 51100003281130V1V1,V2V1,V2,V3V1,V2,V4V1,V5S DISTPATH 第二次遍历:第二次遍历:1 2 3 4 51101003151123V1V1,V2 V1,V2,v4,V3V1,V2,V4V1,v2,V4,v5S DISTPATH 第三次遍历:第三次遍历:1 2 3 4 51111003151123V1V1,V2V1,V2,v4,V3V1,V2,V4V1,v2,V4,v5S DISTPATH经过以上遍历,我们得到从经过以上遍历,我们得到从V1点到各个顶点的最短路径点到各个顶点的最短路径长度以及最短路径所经过的顶
11、点序号。长度以及最短路径所经过的顶点序号。算法的具体描述:算法的具体描述:Procedure dijkstra(GA,dist,path,i);从源点从源点vi点开始点开始 being (1)for j:=1 to n do 初始化初始化 begin if j i then sj:=0 else sj:=1;distj:=GAI,j ;if distjmax then path j:=i+j else pathj:=;end;(2)for k:=1 to n-2 do 计算到各顶点的最短路径计算到各顶点的最短路径 begin (a)w:=max;m:=I;for j:=1 to n do 求出
12、第求出第K个终点个终点Vm if (sj=0)and (distjw)then m:=j;w:=distj (b)if mi then sm:=1 else exit 若条件成立,把若条件成立,把Vm并入到并入到S集合中集合中,否则,否则剩余终点路最短径长度均为剩余终点路最短径长度均为max (c)for j:=1 to n do 调整路径调整路径 if (sj=0)and (distm+GAm,j distj )then begin distj:=distm+GAm,j ;pathj:=pathm+j;end;end;算法的时间复杂性:算法的时间复杂性:O(n2)三、每对顶点之间的最短路径算
13、法:三、每对顶点之间的最短路径算法:1、用狄杰斯特拉算法、用狄杰斯特拉算法2、floyed 算法算法(弗洛伊德)弗洛伊德)Procedure floyed (GA,A,P);BEGIN (1)for i:=1 to n do 给路径长给路径长egin度度A和路径和路径P赋初值赋初值 for j:=1 to n do bejin A I,j :=GAI,J ;if AI,Jmax then pI,j:=i+j else pI,j:=end;(2)For k:=1 to n do for i:=1 to n do for j:=1 to n do begin if (ik)and (jk)and(
14、ij)then if AI,k+Ak,j 0 then begin gI,l:=1;g l,i:=1;end;if r 0 then begin gI,r:=1;gr,i:=1 end end;for k:=1 to n do for i:=1 to n do If i k then for j:=1 to n do if(i j)and(k j)and(gI,k+gk,j gI,j)then gI,j:=gI,k+gk,j;min:=maxlongint;for i:=1 to n do begin s:=0;for j:=1 to n do inc(s,gI,j*wj);if s min
展开阅读全文