图-最短路径(2009级)1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

D 4 3 2
本章要点
熟悉图的各种存储结构及其构造算法,了解图 的基本操作、图的应用问题的求解效率与采用何 种存储结构的联系; 熟练掌握图的两种遍历:深度优先遍历和广度 优先遍历的算法。注意图的遍历算法与树的遍历 算法之间的之间的类似和差异。 应用图的遍历算法求解各种简单路径问题。 理解教科书中讨论的各种图应用的经典算法。
void PrintPath(MGraph G, int i, int Path[]) { if(Path [i]!=-1) { PrintPath(G, Path[i], Path); 40 printf(“, ”); V1 40 V2 18 } 35 20 10 10 PrintVextex(G ,i); } V3 V4
单源点最短路径 迪杰斯特拉算法(Dijkstra) 输入数据:带权图 输出数据:源点s到图中其它各顶点的最短路径
迪杰斯特拉算法基本思想 按长度递增的顺序求解最短路径
40
V1 V3 V1 V3 V4 V1 V3 V4 V2 V1 V5 V1 V5 V6
10 25 35 40 52
V1 20 V3 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4,V2,V5}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4,V2,V5}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4,V2,V5,V6}
40
V2 10
18 35 30
V5
12
V6
15
V4
迪杰斯特拉算法(Dijkstra) 把图中所有顶点分成两组 第1组S包括已求得最短路径的顶点,初始时,只 S={源顶点}; 第2组V-S包括尚未求得最短路径的顶点; 每次从第2组中选择与源点距离最小(路径长度最 短)的顶点,加入第1组, 直至把图的所有顶点都 40 加到进第1组;
Dist
0
35
10
25
40
52
40
V1 40 V2 18 35 30 V5
20
V3
10
15
10 V4
12 V6
0(v1)
Path
1(v2)
2(v3)
3(v4)
4(v5)
5(v6)
(v1,v3,v4,v2) (v1,v3) (v1,v3,v4) (v1,v5) (v1,v5,v6)
Dist
0
35
10
7.6.2 求每一对顶点之间的最短路径 D(-1)[i][j]=G.arc[i][j] D(k)[i][j]= min{ D(k-1)[i][j], D(k-1)[i][k]+D(k-1)[i][k] }
0≤k≤n-1
从vi到vj的中间顶点序号不大于1的最短路径 (D(0)[i][j])为<vi,vj>与<vi,v1> + < v1,vj>小者 从vi到vj的中间顶点序号不大于2的最短路径 (D(1)[i][j])为中间顶点序号不大于1的最短路径 vi,…vj 与vi,…,v2 + v2,…,vj小者
15
V5 12 V6
30
0(v1) 1(v2) 2(v3)
Path -1 3 0
3(v4) 4(v5) 5(v6)
2 0 4
7.6.2 求每一对顶点之间的最短路径 弗洛伊德算法的基本思想 从vi到vj的所有可能存在的路径中,选出一条 长度最短的路径。 1) 不含其它顶点的路径 vi,vj 2) 中间顶点序号不大于1的最短路径 vi,…,vj 3) 中间顶点序号不大于2的最短路径 vi,…,vj …… n)中间顶点序号不大于n的最短路径 vi,…,vj
INFINITY
Dist
40 V1 20 V3 10 15 40 V2 10 V4 18 35 30 V5 12 20 V6 V3 V1 10 15 40
40 V2 10 V4 18 35 30 V5 12 V6
0(v1)
Path
1(v2)
2(v3)
3(v4)
4(v5)
5(v6)
(v1,v3,v4,v2) (v1,v3) (v1,v3,v4) (v1,v5) (v1,v3,v4,v6)
40 V1 20 V3 10 15 40 V2 10 V4 18 35 30 V5 12 20 V6 V3 V1 10 15 40 40 V2 10 V4 18 35 30 V5 12 V6
S={V1,V3}
S={V1,V3,V4}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
AB
1 B 1 A 4 5 D 2
AD BC
CD AD BC
CA
5
C
CAB DB
AB
A B C D
D(1)[i][j] A B C D 1 2 5 1 5 6 2 4 5
CA
CAB DB AAB DB
AB
1 B 1 A 4 5 D 2
ABC BC
AD
CD
35
10 40
25
40 V5 12 V6
55
V1 20 V3 10
40
V2 10
18 35
30
15
V4
40
V1 40 V2 18 35 30 V5
20
V3
10
15
10
V4
12
V6
0(v1)
Path
1(v2) 2(v3) 3(v4) (v1,v2) (v1,v3)
40 10
I NFINITY
4(v5) 5(v6) (v1,v5)
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4,V2}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4,V2}
40 V1 20 10
V1 40 V2 10 15 V4 18 35 30
V5
12 V6
20
V3
10
迪杰斯特拉算法基本步骤: (Dijkstra) 设v1是源点,(第1组) S=已求得最短路径的顶 点集合。 初始时 S={v1}; 1)长度最短的最短路径是所有<v1,v>(v第2组) 中长度最小者。不妨设该顶点为u, <v1,u>长度 最短,将u加入S;
Dist
0
35
10
25
40
55
40 V1 20 V3 10 15 40 V2 10 V4 18 35 30 V5 12 20 V6 V3 V1 10 15 40
40 V2 10 V4 18 35 30 V5 12 V6
0(v1)
Path
1(v2)
2(v3)
3(v4)
4(v5)
5(v6)
(v1,v3,v4,v2) (v1,v3) (v1,v3,v4) (v1,v5) (v1,v3,v4,v6)
指的是对已知图G=(V,E),给定源顶点s∈V, 找出s到图中其它各顶点的最短路径。 每对顶点间的最短路径:Floyd算法 指的是对已知图G=(V,E),对任意的顶点Vi, Vj∈V,找出从Vi到Vj的最短路径。
40 V1 20 V3 10 15 40 V2 10 V4 18 35 30
V5 12
V6
40
18 35
30
void SPath_Dij(MGraph G, int u0, int Dist[],int Path[],int final[])//以u0为源点,求最短路径 { for(i=0; i<G.vexnum; ++i) { final[i]=0; Dist[i]=G.arcs[u0][i]; if(Dist[i]<INFINITY) Path[i]=u0; else Path[i]=-1; }// for final[u0]=1; for (i=1; i<G.vexnum; ++i)//求G.vexnum-1条最短路径 { k=SelectMin(Dist, final); //在 Dist中选择最小者 final[k]=1; //求出的最短路径终点加入顶点集S for(j=0; j<G.vexnum; ++j) //修改V-S中顶点到顶点集S的距离 if (!final[j]&&(Dist[k]+G.arcs[k][j])<Dist[j]) { Dist[j]= Dist[k]+G.arcs[k][j]; Path[j]=k;} }//for }//SPath_Dij
1 B 1
A 4
5 D 2
5
C
A B C D A 5 1 D(-1)[i][j]= B 1 C 5 2 D 4 AB BC CA CD AD
DB
AB
1 B 1 A 4 5 D 2
AD BC
CD
CA
5
C
DB
AB BC AD
D(0)[i][j]
CA
DB AB BC CA CAB DB
CD
AD CD
A B C D A 5 1 B 1 C 5 6 2 D 4
40
INFINITY
Dist
0
40 V1 20 V3 10 15 40
40 18 35 30
V2
10 V4
V5
12 20 V6
V1 10 V3
40
V2 10
18 35 30
V5 12 V6
15
V4
0(v1)
Path
1(v2)
2(v3)
3(v4)
4(v5)
5(v6)
(v1,v2) (v1,v3) (v1,v3,v4) (v1,v5) 0 40 10 25 40
25
40
52
路径数组 int Path[vi]; 源点到vi中间只经过S中顶点的最短路径 “双亲”表示法,存储顶点vi的“双亲”顶点( S) 0(v1) 1(v2) 2(v3) 3(v4) 4(v5) 5(v6)
Path Dist final -1 0 1 3(v4) 35 1 V1 20 V3 10 15 0(v1) 10 1 40 V2 10 V4 2(v3) 25 1 0(v1) 40 1 V5 12 V6 4(v5) 52 1
Dist
0
35
10
25
40
55
40 V1 20 V3 10 15 40 V2 10 V4 18 35 30 V5 12 20 V6 V3 V1 10 15 40
40 V2 10 V4 18 35 30 V5 12 V6
0(v1)
Path
1(v2)
2(v3)
3(v4)
4(v5)
5(v6)
(v1,v3,v4,v2) (v1,v3) (v1,v3,v4) (v1,v5) (v1,v5,v6)
§7.6
最 短 路 径
最短路径 路径长度:路径上边的权值之和
最短路径:长度最小的路径
40 V1 40 V2 18 35 V5 12 V6
20
V3
10
10
V4
15 30 V1到V5:路径: V1,V5 V1,V2,V5 V1,V3,V4,V5 V1,V3,V4,V2,V5
40 58 60 53
单源点最短路径:Dijstra算法
路径数组Path[vi] 源点到vi中间只经过S中顶点的最短路径 距离数组Dist[vi] 源点到vi中间只经过S中顶点的最短路径长度
0(v1) Path Dist 0 1(v2) 2(v3) 3(v4) 4(v5) 5(v6)
(v1,v3,v4,v2) (v1,v3) (v1,v3,v4) (v1,v5) (v1,v3,v4,v6)
5
C
BCA CA CAB DBCA DB
AB BCA CA CAB DBCA DB AB BCA CA CAB DBCA DB
ABC ABCD BC BCD CD DBC ABC ABCD BCD BC CD DBC ABC ABCD BCD BC CD DBC
D(3)[i][j] A B C A 1 2 B 6 1 C 5 6 D 10 4 5
40 V1 20 V3 10 15 40 40
V2
10 V4
18 35 30
V5
12 20 V6
V1 10 V3
40
V2
10
18 35 30
V5
12 V6
15
V4
S={V1}
S={V1,V3}
迪杰斯特拉算法基本步骤 2)下一条长度最短的最短路径是所有路径(v1,vi1, vi2, vik, v) (vijS(第1组), v第2组)中长度最小者, 设该路径的终点为w,将w加入S中; 3)重复 2)直至把图的所有顶点都加到S中。
CA
5
C
CAB DB
AB
DBC
ABC BC DBC AD
D(2)[i][j] A B C A 1 2 B 6 1 C 5 6 D 10 4 5
CA
D 4 3 2
CAB DB AB
CD DBC
BCA CA CAB DBCA DB
ABC ABCD BCD BC CD DBC
AB
1 B 1 A 4 5 D 2
V6
S={V1}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3}
40 V1 20 10
40
V2
10
18
35 30
V5
12
V3
15
V4
V6
S={V1,V3,V4}
40 V1 20 10
相关文档
最新文档