第14讲 图的遍历及应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广东石油化工学院 理学院
25
拓扑排序的方法
从有向图中任选一个入度为0的顶点,并访问 删除该顶点和所有以它为尾的弧
重复上述两步,直至全部顶点均已访问,或当
图中不存在度为0的顶点为止 不存在度为0的顶点: 存在环
弧头顶点的入度减1
广东石油化工学院 理学院
26
构造拓扑排序的存储结构
AOV网用邻接表存储
广东石油化工学院 理学院
66
图的广度优先搜索(BFS)
BFS:V1 V2 V3 V4 V5 V6 V7 V8
V1
V2
V3
V4 V5 V6 V7
V8
V1
V2
V3
V4 V5 V6 V7
V8
BFS:V1 V2 V3 V4 V6 V7 V8 V5
广东石油化工学院 理学院
77
广东石油化工学院 理学院
V1
V2
V3
V4 V5 V6 V7
V8
0
1
5
4
2
3
7
6
99
连通无向图的生成树
设G=(V,E)是一个连通图 则从图中任一顶点出发,遍历图G时,得到一个 边集T(G)
显然,T(G)与图中所有顶点一起构成图G的 极小连通子图 它是连通图的一棵生成树
由DFS 得到的是深度优先生成树 由BFS得到的为广度优先生成树
V2
V3
V4 V5 V6 V7
V8
V1
V2
V3
V4 V5 V6 V7
V8 广度优先生成树
广东石油化工学院 理学院
11
非连通图的生成森林
非连通图,每个连通分量中的顶点集和遍历时走
过的边一起构成若干棵生成树
这些连通分量的生成树组成非连通图的生成森林
A
CD
F
G
I J
L
B E H K
M
A
D
LCF
E
V1
V2
V3
V4 V5 V6
V7
V8
V1
V2
V3
V4 V5 V6
V7
V8
DFS:V1 V2 V4 V8 V3 V6 V7 V5 DFS:V1 V3 V7 V6 V2V4 V8 V5
广东石油化工学院 理学院
4
图的深度优先遍历(DFS )
类似树的深度遍历
设初始状态:图中所有顶点都没被访问过
图的广度优先搜索算法
static Queue<Integer> queue=new LinkedList<Integer>();
public static void bfs(Vexnode[] graph,int v,int[] visited){
int w;
System.out.print(“访问顶点”+v+“ ”);
广东石油化工学院 理学院
10
V1
V2
V3
深度遍历: V1 V2 V4 V8 V5 V3 V6 V7
广度遍历: V1 V2 V3 V4 V5 V6 V7 V8
V4 V5 V6 V7
V1
V8
V1
V2
V3
V1
V2
V3
V4
V6
V4 V5 V6 V7 V8
V7
V8
V5
深度优先生成树
AOV网 顶点表示活动的网 顶点表示活动,弧表示活动间的先后关系 AOV网中不允许有回路,这意味着某项活动以 自己为先决条件
广东石油化工学院 理学院
21
C4
C5
C2
C1
C3
C7
C12 C8
C9
C10
C6
C11
死锁?
课程代号 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12
问题分析 n个城市间,最多可设置n(n-1)/2条线路 n个城市间建立通信网,只需n-1条线路 如何在可能的线路中选择n-1条边,把所有城 市连起来,且总耗费(各边权值之和)最小
找图中的最小生成树
广东石油化工学院 理学院
13
PRIM算法
贪心法 旅行推销员(TSP)问题
推销员从其中某一城市出发,走遍n个城市,再回 到出发的城市,求最短的路线
第14讲 图的遍历及应用 ----(最小生成树和拓扑排序)
广东石油化工学院 理学院
1
图的遍历
从图中某顶点出发,沿一些边访问图中顶点,使每个 顶点都被访问到,且仅被访问一次,叫做图的遍历
无重复,无遗漏 关键点
图中可能存在回路
图的顶点可能与其它顶点相通,在访问完某顶点后,可能沿 着某些边回到曾经访问过的顶点
在带权无向完全图中,访问每个顶点恰好一次、并且返 回出发点、总权数最小的回路
适合稠密图
广东石油化工学院 理学院
14
普里姆(Prim)算法最小生成树的过程
28
01
10 14 16
562
25 24 18 12
4 22 3
01
10 14 16
562
25 4
12
3
22
原图
(a)
广东石油化工学院 理学院
visited[v]=1;
queue.clear();
queue.add(v);
while(!queue.isEmpty()){
v=queue.poll();//队头元素v出队列
Arcnode p=graph[v].getFirstArc();
while(p!=null){
w=p.getAdjvex();
while(p!=null) {
V4 V5
if(visited[p.getAdjvex()]==0)//没有访问过
dfs(graph,p.getAdjvex(),visited);
p=p.getNextArc();
V8
}
}
visited
v1
v2
v3
v4
v5
v6
v7
0
0
0
0
0
0
0
V3
V6
V7
v8 0
广东石油化工学院 理学院
如此重复,直到所有顶点均被访问过为止 V1
public static void dfs(Vexnode[] graph,int v,int[] visited){
Arcnode p;
System.out.print(“访问顶点”+v+“ ”);
V2
visited[v]=1;//表示被访问
p=graph[v].getFirstArc();
顶点表示课程
有向弧表示先决条件
若课程i是课程j的先决条件
则图中有弧<i,j>
拓扑排序
应怎样学习这些课程,才能顺 把AOV网络中各顶点
利完成学业?
按照它们之间的先后
关系排列成一个线性
序列的过程
拓扑序列
广东石油化工学院 理学院
23
拓扑排序的过程
C0
C1
C2
C3
C4
C5
有向无环图
从图中某一顶点v0出发,访问v0,然后访问与v0邻接,但未被访问过的任一顶点v1
接着访问与v1邻接,但未被访问过的任意顶点V2
当达到某顶点时,发现其所有邻接顶点均被访问过,则退回到最近被访问过的前一顶
点
若它还有邻接点未被访问过,从未被访问过的顶点中,任取一顶点,重复这一过程
若所有邻接顶点被访问过,则再回退
为避免重复访问,可设辅助数组visited[]
将其初始化为0 遍历时,如果某顶点 i 被访问,将 visited [i]置 为1 以此防止顶点i被多次访问
广东石油化工学院 理学院
2
图的深度优先搜索(DFS)
广东石油化工学院 理学院
3
图的深度优先搜索(DFS)
DFS:V1 V2 V4 V8 V5 V3 V6 V7
在邻接表的表头结点增加存放顶点入度的域
栈存放入度为零的顶点
v1
0
v2
2
v3
1
v4
2
v5
3
v6
0
4
3
2
5
2
5
5
4
拓扑序列:1 6 4 3 2 5
广东石油化工学院 理学院
27 27
广东石油化工学院 理学院
课程名称 程序设计基础
离散数学 数据结构 汇编语言 算法分析与设计 计算机原理 编译原理 操作系统 高等数学 线性代数 普通物理 数值分析
先修课 无 C1
C1,C2 C1
C3,C4 C11
C3,C5 C3,C6
无 C9 来自百度文库9 C1,C9,C10
22
拓扑排序
问题提出
选修课程问题
算法 时间复杂度为o(n2),其中n为网中顶点的个数 Prim算法适用于求边稠密的网的最小生成树
广东石油化工学院 理学院
16
克鲁斯卡尔算法构造最小生成树的过程
适合简单图
28
01
01
10 14 16
5 6 25 6 2
25 24
18 12
43
43
22
原图
(a)
广东石油化工学院 理学院
01
10 14 16
562
25
12
43
22
(b)
17
最小生成树——克鲁斯卡尔(Kruskal)算法
算法 设连通网N={V,E}, 令最小生成树的初始状态为 有n个顶点,无边的非连通图T=(V,Φ) 图中每一个顶点自成一个连通分量 在E中选择权最小的边 若此边依附的顶点落在T的不同的连通分量上,则将此边加入 到T中 该边的加入将使两个连通分量合成一个连通分量 否则该边的加入必然出现回路,所以舍去此边,选择下一条 代价最小的边 依此类推,直到T 中所有顶点在同一连通分量上
15
最小生成树(Prim)算法
方法 设N=(V,E)是连通网,T=(U,E‘)是正在构造中的生成树 初始时,生成树只有一个结点,没有边
U={u0},E’={ },u0是任意选定的顶点, 从初始状态开始重复执行下列的操作
在所有u∈U,v∈V-U的边(u,v),(u,v)∈E中找一条 代价最小的边(u‘,v’)并入集合E‘,同时V’并入集合U, 直到V=U为止。
C0
C1
C2
C4 C0 C3 C2 C1 C5
C3
C4
C5
广东石油化工学院 理学院
24
拓扑排序举例
一个AOV网的拓
扑序列不是唯一的
C4 C2 C1 C12
C9 C10
C5
C3
C7
C8 C6
C11
拓扑序列: C1-C2-C3-C4-C5-C7-C9-C10-C11-C6-C12-C8 或: C9-C10-C11-C6-C1-C12-C4-C2-C3-C5-C7-C8
55
图的广度优先搜索(BFS)
类似于树的层次遍历
假设初始状态是图中所有顶点都没被访问过 从图中某一顶点v0出发,访问v0 然后访问v0的全部邻接点w1,w2,...,wt 再从这些被访问的顶点出发,逐次访问它们的邻
接点(已被访问的顶点除外) 依此类推,直到所有顶点都被访问为止
M JB
深度优先生成森林
G
K
I
H
广东石油化工学院 理学院
12 12
最小生成树
问题提出 在n个城市间建立通信网络
顶点—表示城市 权—城市间建立通信线路所需
花费代价
1
7
2
13
7 9
5
5 6
24
17
10 12
3
18
4
希望找到一条路径,使建立该 通信网所需花费的总代价最小
路径上各边权值的和最小
广东石油化工学院 理学院
18
练习题
615
2
1
5
5
4
3 36
5
2
(Prim)算法
1
2
1
4
5
3 3
5
2
广东石油化工学院 理学院
19
克鲁斯卡尔(Kruskal)算法
A 6
B 14 12
D 14
15 F
8
C 17
E 5
6A8
B 14
C
12
D
E
F5
广东石油化工学院 理学院
20
有向无环图有关概念
无环图(DAG) 一个无环(回路)的有向图叫做有向无环图 directed acycline graph
if(visited[w]==0){
System.out.print("访问顶点"+w+" ");
visited[w]=1;
queue.add(w);//顶点w进队列Q
}
p=p.getNextArc();
}
}
}
队列
V1
V2
V3
V4 V5 V6 V7
V8
广东石油化工学院 理学院
88
图的连通性
怎样求图的连通分量?