第 8 章 图的应用

39
DS 第 8 第 第第第第

Upload: gloria-todd

Post on 02-Jan-2016

77 views

Category:

Documents


10 download

DESCRIPTION

第 8 章 图的应用. 1. 图的生成树和最小生成树. 2. 3. 最短路径. 拓扑排序. 4. 关键路径*. 主要内容. 8.1 图的生成树和最小生成树. 8.1.1 生成树和最小生成树的概念 8.1.2 普里姆算法 8.1.2 克鲁斯卡尔算法. 8.1.1 生成树和最小生成树的概念. 生成树 定义:所有顶点均由边连接在一起,但不存在回路的图叫生成树 深度优先生成树与广度优先生成树 一个图可以有许多棵不同的生成树 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同 生成树是图的极小连通子图 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 8 章 图的应用

DS

第 8 章 图的应用

Page 2: 第 8 章 图的应用

2008-7-3

DS

Slide 2 of 39第 7 章 图

主要内容

图的生成树和最小生成树1

最短路径2

拓扑排序3

关键路径 *4

Page 3: 第 8 章 图的应用

2008-7-3

DS

Slide 3 of 39第 7 章 图

8.1 图的生成树和最小生成树

8.1.1 生成树和最小生成树的概念8.1.2 普里姆算法8.1.2 克鲁斯卡尔算法

Page 4: 第 8 章 图的应用

2008-7-3

DS

Slide 4 of 39第 7 章 图

8.1.1 生成树和最小生成树的概念生成树

定义:所有顶点均由边连接在一起,但不存在回路的图叫生成树深度优先生成树与广度优先生成树一个图可以有许多棵不同的生成树所有生成树具有以下共同特点:

生成树的顶点个数与图的顶点个数相同生成树是图的极小连通子图一个有 n个顶点的连通图的生成树有 n-1 条边生成树中任意两个顶点间的路径是唯一的在生成树中再加一条边必然形成回路

含 n个顶点 n-1 条边的图不一定是生成树

Page 5: 第 8 章 图的应用

2008-7-3

DS

Slide 5 of 39第 7 章 图

8.1.1 生成树和最小生成树的概念

0

54 2

673

1

0

54 2

673

1

0

54 2

673

1

0

54 2

673

1

连通图

深度优先生成树

广度优先生成树

任意一颗生成树

Page 6: 第 8 章 图的应用

2008-7-3

DS

Slide 6 of 39第 7 章 图

8.1.1 生成树和最小生成树的概念

最小生成树问题提出要在 n个城市间建立通信联络网顶点 --表示城市权 --城市间建立通信线路所需花费的代价希望找到一棵生成树,它的每条边上的权值之和(即建立该通信网所需花费的总代价)最小 --最小代价生成树

0

6

3

2

54

1

12

53

10

8

69

27

15

Page 7: 第 8 章 图的应用

2008-7-3

DS

Slide 7 of 39第 7 章 图

8.1.1 生成树和最小生成树的概念

问题分析n个城市间,最多可设置 n(n-1)/2 条线路n个城市间建立通信网,只需 n-1条线路问题转化为:如何在可能的线路中选择 n-1条,能把所有城市(顶点)均连起来,且总耗费各边权值之和)最小

构造最小生成树方法方法一:普里姆 (Prim) 算法方法二:库鲁斯卡尔 (Kruskal) 算法

Page 8: 第 8 章 图的应用

2008-7-3

DS

Slide 8 of 39第 7 章 图

8.1.2 普里姆算法

算法思想:设 N=(V,{E}) 是连通网, TE 是 N 上最小生成树中边的集合初始令 U={u0},(u0V), TE=在所有 uU,vV-U 的边 (u,v)E 中,找一条代价最小的边 (u0,v0)将 (u0,v0) 并入集合 TE ,同时 v0 并入 U重复上述操作直至 U=V 为止,则 T=(V,{TE}) 为 N的最小生成树

Page 9: 第 8 章 图的应用

2008-7-3

DS

Slide 9 of 39第 7 章 图

8.1.2 普里姆算法

0

6

3

2

54

1

12

53

10

8

69

27

15

0

3

2

54

15

3

6 27

0 0

3

5 0

31

53

0

3

5

15

3

7

0

3

2

5

15

3

2 7

0

6

3

2

54

15

3

6 2 7

15

Page 10: 第 8 章 图的应用

2008-7-3

DS

Slide 10 of 39第 7 章 图

8.1.2 普里姆算法算法实现:图用邻接矩阵表示算法描述算法评价:

时间复杂度 O(n²)空间复杂度 O(1)

利用算法得到的边集数组为:

CT 0 1 2 3 4 5

fromvex 0 3 3 5 2 3

endvex 3 1 5 2 4 6

weight 5 3 7 2 6 15

Page 11: 第 8 章 图的应用

2008-7-3

DS

Slide 11 of 39第 7 章 图

8.1.3 克鲁斯卡算法

算法思想:设连通网 N=(V,{E}) ,令最小生成树初始状态为只有 n 个顶点而无边的非连通图 T=(V,{}) ,每个顶点自成一个连通分量在 E 中选取代价最小的边,若该边依附的顶点落在T 中不同的连通分量上,则将此边加入到 T 中;否则,舍去此边,选取下一条代价最小的边依此类推,直至 T 中所有顶点都在同一连通分量上为止

Page 12: 第 8 章 图的应用

2008-7-3

DS

Slide 12 of 39第 7 章 图

8.1.3 克鲁斯卡算法

0 1 2 3 4 5 6 7 8 9

fromvex 0 1 1 2 1 3 0 3 0 4

endvex 4 2 3 3 5 5 1 4 5 5

weight 4 5 8 10 12 15 18 20 23 25

0

5 2

1

34

18

2312

825

15

20

10

5

4

CT 0 1 2 3 4

fromvex 0 1 1 1 0

endvex 4 2 3 5 1

weight 4 5 8 12 18

Page 13: 第 8 章 图的应用

2008-7-3

DS

Slide 13 of 39第 7 章 图

8.1.3 克鲁斯卡算法

算法实现:图用边集数组表示算法描述算法评价:

时间复杂度 O(n²)空间复杂度 O(n²)

Kruskal.cpp

Page 14: 第 8 章 图的应用

2008-7-3

DS

Slide 14 of 39第 7 章 图

8.2 最短路径

8.2.1 最短路径的概念8.2.2 从一顶点到其余各顶点的最短路径8.2.3 每对顶点之间的最短路径 *

Page 15: 第 8 章 图的应用

2008-7-3

DS

Slide 15 of 39第 7 章 图

8.2.1 最短路径的概念

旅客希望停靠站越少越好,则应选择:

济南——北京——太原——兰州旅客考虑的是旅程越短越好,则应选择:

济南——徐州——郑州——西安——兰州

兰州太原 北京

济南徐州

郑州

西安

1120 920

720210

540340

640

190

Page 16: 第 8 章 图的应用

2008-7-3

DS

Slide 16 of 39第 7 章 图

8.2.1 最短路径的概念

最短路径:从一顶点到另一顶点间路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。

带权路径长度:在带权图中,把从一个顶点 i 到图中其余任一个顶点 j 的一条路径上所经过边的权值之和定义为该路径的带权路径长度。路径长度最短(即其值最小)的那条路径称做最短路径,其权值称做最短路径长度或最短距离。

Page 17: 第 8 章 图的应用

2008-7-3

DS

Slide 17 of 39第 7 章 图

8.2.1 最短路径的概念

V0~V4 的路径有:{0 , 4} :长度为 30{0 , 1 , 3 , 4} :长度为 23{0 , 1 , 2 , 4} :长度为 38

50

4

32

130

12

4

108

3

25

Page 18: 第 8 章 图的应用

2008-7-3

DS

Slide 18 of 39第 7 章 图

8.2.2 从一顶点到其余各顶点的最短路径 (Dijkstra)

思想:贪心算法 ( 局部最优 ) ,按路径长度递增的次序产生最短路径。

贪心算法 : 利用局部最优来计算全局最优。Dijkstra :利用已得到的顶点的最短路径来计算其它

顶点的最短路径。

Page 19: 第 8 章 图的应用

2008-7-3

DS

Slide 19 of 39第 7 章 图

8.2.2 从一顶点到其余各顶点的最短路径 (Dijkstra)

终点 从 V0 到各终点的最短路径及其长度

V1

3<V0,V1>

V2

∞<V0,V2>

28<V0,V1,V2>

15<V0,V1, V3,V2>

V3

∞<V0,V3>

11<V0,V1,V3>

V4

30<V0,V4>

30<V0,V4>

23<V0,V1, V3,V4>

23<V0,V1, V3,V4>

Vj1:3

<V0,V1>3:13

<V0,V1,V3>2:15

<V0,V1, V3,V2>4:23

<V0,V1, V3,V4>

50

4

32

130

12

4

108

3

25

Page 20: 第 8 章 图的应用

2008-7-3

DS

Slide 20 of 39第 7 章 图

算法

Dijkstra.cpp

8.2.2 从一顶点到其余各顶点的最短路径 (Dijkstra)

Path.cpp

Page 21: 第 8 章 图的应用

2008-7-3

DS

Slide 21 of 39第 7 章 图

8.3 拓扑排序

8.3.1 拓扑排序的概念8.3.2 拓扑排序算法

Page 22: 第 8 章 图的应用

2008-7-3

DS

Slide 22 of 39第 7 章 图

8.3.1 拓扑排序的概念

问题提出:学生选修课程问题顶点 -- 表示课程有向弧 -- 表示先决条件,若课程 i 是课程 j 的先决条件,则图中有弧 <i,j> 学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业 -- 拓扑排序

课程代号 课程名称 先修课程C1 高等数学 无

C2程序设计基

础 无

C3 离散数学 C1, C2C4 数据结构 C3, C5C5 算法语言 C2

C6 编译技术 C4, C5C7 操作系统 C4, C9

C8 普通物理 C1

C9 计算机原理 C8

Page 23: 第 8 章 图的应用

2008-7-3

DS

Slide 23 of 39第 7 章 图

8.3.1 拓扑排序的概念

AOV 网:用顶点表示活动,用弧表示活动间先后关系的有向图称为顶点活动网 (Activity On Vertex network) ,简称 AOV 网若 <vi,vj> 是图中有向边,则 vi 是 vj 的直接前驱; v

j 是 vi 的直接后继AOV 网中不允许有回路,这意味着某项活动以自己为先决条件

Page 24: 第 8 章 图的应用

2008-7-3

DS

Slide 24 of 39第 7 章 图

8.3.1 拓扑排序的概念

拓扑序列:在 AOV 网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,此序列叫做拓扑序列。

拓扑排序:有 AOV 网构造拓扑序列的过程叫做拓扑排序。该序列不是唯一的。实现方法:

选择一个入度为 0 的顶点并输出之从网中删除此顶点及所有出边重复上述两步,直至不存在入度为 0 的顶点为止

Page 25: 第 8 章 图的应用

2008-7-3

DS

Slide 25 of 39第 7 章 图

8.3.1 拓扑排序的概念

拓扑序列:C1, C8, C9, C2, C3, C5, C4, C7, C6C2, C1, C3,C5,C4,C6,C8,C9,C7

课程代号 课程名称 先修课程C1 高等数学 无C2 程序设计基础 无C3 离散数学 C1, C2C4 数据结构 C3, C5C5 算法语言 C2

C6 编译技术 C4, C5C7 操作系统 C4, C9C8 普通物理 C1

C9 计算机原理 C8

C1

C3

C2 C5

C8 C9

C4

C6

C7

Page 26: 第 8 章 图的应用

2008-7-3

DS

Slide 26 of 39第 7 章 图

8.3.2 拓扑排序算法

AOV 网采用邻接表作为存储结构

数组 d[ ] 存放顶点的入度

将所有入度为 0 的顶点链接成一个栈

0 1 2 3 4 5

0 0 2 2 1 3

0

1

2

3

4

5

3 2

5

^

^

2 ^

4

3 2 ^

5 ^

^

Page 27: 第 8 章 图的应用

0 0 2 2 1 3 0 2

1 4 3 2

2 5 3

3 5

4 5

5

入度表入度表 top=-1top=-1

-1 0 2 2 1 3 -1 0 2 2 1 3

输出 输出 11

-1 0 2 2 1 3 -1 0 1 1 0 3

-1 0 1 1 0 3

-1 0 1 1 0 244

Page 28: 第 8 章 图的应用

0 2

1 4 3 2

2 5 3

3 5

4 5

5

-1 0 1 1 0 2

-1 0 -1 1 0 2

00 22 33

-1 0 -1 -1 0 1

-1 0 -1 -1 0 -1

-1 0 -1 -1 0 -1 55输出 输出 1144

Page 29: 第 8 章 图的应用

2008-7-3

DS

Slide 29 of 39第 7 章 图

8.3.2 拓扑排序算法

00

11

44

33

22

551

2

4

0

53

0 2

1 4 3 2

2 5 3

3 5

4 5

5

1 4 0 2 3 5 1 4 0 2 3 5

Page 30: 第 8 章 图的应用

2008-7-3

DS

Slide 30 of 39第 7 章 图

8.3.2 拓扑排序算法

算法实现算法分析:时间复杂度为 O(n+e)

Toposort.cpp

Page 31: 第 8 章 图的应用

2008-7-3

DS

Slide 31 of 39第 7 章 图

8.4 关键路径

8.4.1 顶点事件的发生时间8.4.2 计算关键路径的方法和算法

Page 32: 第 8 章 图的应用

2008-7-3

DS

Slide 32 of 39第 7 章 图

8.4.1 顶点事件的发生时间把工程计划表示为有向图,用顶点表示事件,弧表示活动;每个事件表示在它之前的活动已完成,在它之后的活动可以开始。

例 设一个工程有 11项活动, 9个事件事件 V1-- 表示整个工程开始事件 V9-- 表示整个工程结束问题:( 1)完成整项工程至少需要多少时间? ( 2)哪些活动是影响工程进度的关键?

9

8

7

64

5

3

2

1

a1=6

a2=4

a3=5

a4=1

a5=1

a6=2

a7=9

a8=7

a9=4

a10=2

a11=4

Page 33: 第 8 章 图的应用

2008-7-3

DS

Slide 33 of 39第 7 章 图

8.4.1 顶点事件的发生时间

AOE 网 (Activity On Edge)——也叫边表示活动的网。 AOE 网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间

路径长度——路径上各活动持续时间之和关键路径——路径长度最长的路径Ve(j)—— 表示事件 Vj 的最早发生时间Vl(j)—— 表示事件 Vj 的最迟发生时间e(i)—— 表示活动 ai 的最早开始时间l(i)—— 表示活动 ai 的最迟开始时间

Page 34: 第 8 章 图的应用

2008-7-3

DS

Slide 34 of 39第 7 章 图

8.4.1 顶点事件的发生时间

l(i)-e(i)—— 表示完成活动 ai 的时间余量关键活动——关键路径上的活动叫关键活动,即l(i)=e(i) 的活动如何找 e(i)=l(i) 的关键活动?

设活动 ai 用弧 <j,k> 表示,其持续时间记为: dut(<j,k>)

则有:( 1 ) e(i)=Ve(j) ( 2 ) l(i)=Vl(k)-dut(<j,k>)

j k

ai

Page 35: 第 8 章 图的应用

2008-7-3

DS

Slide 35 of 39第 7 章 图

8.4.1 顶点事件的发生时间

如何求 Ve(j) 和 Vl(j) ?(1) 从 Ve(1)=0开始向前递推

(2) 从 Vl(n)=Ve(n)开始向后递推

为尾的弧的集合是所有以其中 iS

niSjijidutjVlMiniVlj

11,,)},,()({)(

Page 36: 第 8 章 图的应用

2008-7-3

DS

Slide 36 of 39第 7 章 图

8.4.2 计算关键路径的方法和算法关键路径步骤

求 Ve(i) , Vl(j) , e(i) , l(i) ,计算 l(i)-e(i)

V1V2V3V4V5V6V7V8V9

顶点 Ve Vl064577161418

0668710161418

9

8

7

64

5

3

2

1

a1=6

a2=4

a3=5

a4=1

a5=1

a6=2

a7=9

a8=7

a9=4

a10=2

a11=4

Page 37: 第 8 章 图的应用

2008-7-3

DS

Slide 37 of 39第 7 章 图

8.4.2 计算关键路径的方法和算法

a1a2a3a4a5a6a7a8a9a10a11

活动 e l l-e

0 0 00 2 2

6 6 04 6 25 8 37 7 07 7 07 10 316 16 014 14 0

0 3 3

9

8

7

64

5

3

2

1

a1=6

a2=4

a3=5

a4=1

a5=1

a6=2

a7=9

a8=7

a9=4

a10=2

a11=4

V1V2V3V4V5V6V7V8V9

顶点 Ve Vl064577161418

0668710161418

Page 38: 第 8 章 图的应用

2008-7-3

DS

Slide 38 of 39第 7 章 图

8.4.2 计算关键路径的方法和算法

计算关键路径的算法用邻接表实现时间复杂度: O(n+e)

调试图的拓扑排序算法和关键路径算法的程序

Cripath.cpp Main.cpp

Page 39: 第 8 章 图的应用

2008-7-3

DS

Slide 39 of 39第 7 章 图

作业

P302T 习题 8-1 : 1 , 2 , 6, 7