图的最短路径(ppt文档)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
11
begin min:=max ; flag[1]:=[1] ; city[1]:=1 ; n:=0 ;pnt[1]:=0 ; r:=1 ;f:=0; repeat inc(f); k:=city[f]; if k<>m then begin flags:=flag[f] ; for j:= 2 to m do if (not( j in flags )) and (link[k,j]>0 ) then begin inc(r); city[r]:=j; flag[r]:=flags+[j];
图的最短路径
1
最短路径
一、最短路径 从一个顶点到另一个顶点最短路径长度,称为最短路
径。
2
从源点Vi到终点Vj的每条路径上的权(它等于 该路径上所经边上的权值之和,称为该路径的带 权路径长度)可能不同,我们把权值最小的那条 路径称为最短路径。
例如:图中V1到V5共有三条路径: (v1,v5),(v1,v2,v3,v5),(v1,v2,v4,v5),其带权 路径长度分别为30,23和38,其最短路径为23。
18
第三次遍历:
1
2
3
4
5
S
1
DIST
0
PATH V1
1
1
1
0
3
15
11
23
V1,V2 V1,V2,v4,V3 V1,V2,V4 V1,v2,V4,v 5
19
经过以上遍历,我们得到从V1点到各个顶点的最短路径 长度以及最短路径所经过的顶点序号。 算法的具体描述: Procedure dijkstra (GA,dist , path , i) ;{ 从源点vi点开始}
3
二、从一个顶点到其余各顶点的最短路径 1、算法的基本思想:广度优先遍历方法。 最短路径是指由n个顶点e条边组成的图G,从 某个顶点Vi出发,到另一个顶点Vj的最短路径。 它可能是直达路径也可能是经过K个点所形成的 最短路径。
4
例题1 如图所示6个城市之间道路联系图,编一个程序由 计算机找到从C1城市到C6城市之间长度尽可能短的一条 路径以及路径总长度。
s:array[1..10] of 1..m ; begin
y:=f ; 9
n:=0 ; cost:=0 ; while y>0 do begin inc(n);s[n]:=y;y:=pnt[y] ; end; for i:=n-1 downto 1 do cost:=cost+link[city[s[i+1]],city[s[i]]]; if cost<min then begin step:=n-1 ; min:=cost ; for i:=1 to step do path[i]:=city[s[i]]; end;
S DIST PATH
1
2
3
4
5
1
0
0
0
0
0
3


30
V1
V1,V2
V1,V5
16
第一次遍历:
1
2
3
4
5
S DIST PATH
1
1
0
0
0
0
3
28
11
30
V1 V1,V2 V1,V2,V3 V1,V2,V4 V1,V5
17
第二次遍历:
1
2
3
4
5
S DIST PATH
1
1
0
1
0
0
3
15
11
23
V1 V1,V2 V1,V2,v4,V3 V1,V2,V4 V1,v2,V4,v5
10
end; procedure print ; begin
writeln('the sort path :') ; write('1'); for i:=step downto 1 do write('->',path[i]); writeln; writeln('min=',min); end;
(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));
8
type fg=set of 1..m ; var
city,pnt:array[1..100 ] of byte ; flag : array[1..100 ] of fg ; flags:fg ; i,k,n,r,f:integer ; path :array[1..10] of 1..m ; min,step:integer; procedure work ; var n,i,y,cost :integer ;
12
pnt[r]:=f ;
if f=m then work ; end; end; until f >=r ; print ; readln ; end.
13
1 Dijktra 算法:荻(杰)克斯特拉
(1) 从源点Vi到其余每个顶点的最短路径的升序 依次求出从源点到各顶点最短路径长度。
(2)每次求出从源点Vi到一个终点Vj的最短路径 后,要以Vj作为新考虑的中间点,用Vi到Vj的最 短路径长度和Vi到其它尚未求出最短路径的那些 终点的当前最短路径长度进行比较、修改,使它 成为当前新的最短路径长度,当进行n-2次后算 法结束。
5
用广度优先的遍历方法求解最短路径: (1)用邻接矩阵存储图的结构 (2)用广度优先的队列存储访问的顶点: (3)记录访问过的城市 是一种搜索算法,以便找到最短的路径
6
•问题求解的基本方法:广度优先算法 (1)存储该图中顶点之间的关系和路径长度 (2)从起点开始搜索,将访问点入队,并记录已经被 访问过的城市。在搜索中注意本问题中,最先找到的路 径未必是最短路径,只是走过城市最少的路径。
顶点 1 2 3 4 5 6
1048000
2403460
3830220
4042049
5062404
6000940
7
•(3)判断当前的路径是否是最短路径 •(4)输出最短路径的长度及所访问的过程 程序说明如下: program short ; const m=6;max=32767 ; link:array[1..m,1..m] of integer=((0,4,8,0,0,0),
14
如图所示:
(1)设置一个集合数组S,作用是标记已经求得最短路
径的终点号,初始值只有一个源点,每找到一个最短路径
的终点,将该终点并入S集合中,以便作为新的中间点。
若选取为1否则为0
(2)设置数组dist,该数组的第j个元素dist[j]用来保
存从源点Vi到Vj的目ath为集合数组,存放最短路径经过的顶点集 合。对于前面图的结构,假设从V1出发到各个顶点的最短 路径,其开始数组S,DIST,PATH的值如下:
相关文档
最新文档