7.3 图的遍历

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

3100011000
4010000011
5011000101 1
2
3
4
6001000101
7000011001 9
6
8
5
8010100001
9000111110 7
7.3 图的遍历
1 2 3 4 5
6∧
7 8 9
2 12 4 15 58 8 18 2 5∧
5 23 9 15 ∧ 5 12
3 10 ∧ 8 6∧ 6 15 ∧ 9 21 ∧
7.3 图的遍历
Traversing Graph:从图中某一顶点出发,经过图中其余顶点 ,且使每个顶点仅被访问一次。无重复无遗漏访问图中顶点
Traversing Graph:是关于图操作的算法基础,例如图的连 通性判断、拓扑排序、关键路径、最短路径等。
7.3 图的遍历
7.3 图的遍历
SV
SV为遍历的起始顶点
同时将这些邻接顶点设置为已访问;
实用优化技巧:可设置统计变量实时跟踪入队顶点数量, 若达到图中顶点数,则直接进行出队访问操作直至队列 为空结束,无需再检测是否有未被访问的邻接顶点
7.3 图的遍历
计算机无递归实现: 借助栈来实现 STEP 1:选择起始顶点v进栈,并置其已访问; STEP 2:只要栈不为NULL,循环做如下事情: STEP 2.1:出栈顶点w进入结果队列或直接访问; STEP 2.2:将顶点w所有未被访问过的邻接顶点入栈; 同时将这些邻接顶点设置为已访问;
7.3 图的遍历
7.3 图的遍历
1 2 3 4 5
6∧
7 8 9
2 12 4 15 58 8 18 2 5∧
5 23 9 15 ∧ 5 12
3 10 ∧ 8 6∧ 6 15 ∧ 9 21 ∧
68
6 9∧
15 2
6
18 8
21 15 12
21
9
12 1
5
5 8 10
23 3 7 8 15
9
6
9 21 ∧
通过案例分析逐步推导 重点关注递归回退过程
W1
SG1
W2
W3
SG2
Wi为 SV 的邻接点 SGi:含顶点Wi的子图
关键点: 图中可能存在回路 解决方案: 设置顶点visited数组
初始时值全为0,访问过重置为1,避免兜圈子
7.3 图的遍历
连通图深度递归遍历
void DFS ( Mgraph G,int v ) {
访问序号为v的顶点;
visited[v] = 1;
8 4
7 6
9
4
8
5
6
9
7
以距离起点的路径长度为层次进行扩展
典型特征:
先被访问的顶点的邻接点,也先被访问
队列思想
7.3 图的遍历
visited 10 10 10 10 10 10 10 01 01
123456789
1 0 1 1 0 0 0 0 0 0 21 34 5 6897
2100110010
7.3 图的遍历
visited 10 10 10 10 10 10 10 01 01
123456789
1
2
4
1011000000
2100110010
3100011000
8
9
4010000011
5011000101 6001000101
5
3
7000011001
8010100001
6
SG1
SV
W2
W3
SG2
for(w = FirstAdjVex(G, v);;w = NextAdjVex(G, v, w))
if ( w存在&&visited[w] ==0 ) DFS( G, w);

7.3 图的遍历
普通图深度遍历 普通图由多个连通图构成
int visited[MAX_VERTEX_NUM];
(3)检查是否有尚未访问顶点,若有则从未被访问的顶 点中任意选择一个顶点重复(1)和(2);
(4)直至图中所有顶点都被访问到为止。
7.3 图的遍历
计算机实现: 借助队列来实现
STEP 1:选择起始顶点v进队列,并置其已访问;
STEP 2:只要队列不为NULL,循环做如下事情:
STEP 2.1:出队顶点w进入结果队列或直接访问; STEP 2.2:将顶点w所有未被访问过的邻接顶点入队;
7.3 图的遍历
(图结构第三讲)
网络工程学院 王洪峰
遥远的距离
世界上最遥远的距离,不是从南极到北极, 而是我在讲解算法为何如此精妙,您却能够安详在课堂上睡觉。 世界上最遥远的距离,不是珠峰与马里亚纳海沟的距离, 而是我欲把古人的智慧全盘给您,您却不屑一顾毫不怜惜。 世界上最遥远的距离,不是牛A与牛C的狭小空隙, 而是您们当中,有人在通往牛逼的路上一路狂奔, 而有人步入大学校园就学会放弃……
DFS算法效率分析
遍历实质:对每个顶点寻找邻接点的过程 时间耗费取决于图的存储结构
邻接表:n个结点e条边; 找邻接点时间:O(e) 访问头结点: O(n) 总时间代价:O(n+e)
邻接矩阵:DFS对于每一 个顶点,都要循环检测矩 阵中的整整一行 总时间代价:O(n2)
7.3 图的遍历
1
2
3
5
1
2
3
void DFSTraverse ( Mgraph G,int v ) {
for( v = 0;v < G.curVexsNum;v++) visited[v] = 0;
for( v = 0;v < G.curVexsNum;v++) if ( visited[v] ==0 ) DFS( G, v);
271 34 85 69
6 15 ∧
9 21 ∧
1
2
3
4
7
68
9
6
5
8
9 21 ∧
6 9∧
7.3 图的遍历
基本思想:类似树的层序遍历
具体步骤: (1)从图中某个顶点v出发,访问顶点v ; (2)然后依次访问v的未被访问的所有邻接点,同时确保
“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点” 被访问,直到图中所有已被访问的顶点的邻接点都被访问到;

7.3 图的遍历
基本思想:类似树的先序遍历
具体步骤: (1)从图中某个顶点v出发,访问顶点v ; (2)然后从v的未被访问的邻接点出发深度优先遍历图,
直至图中所有和v有路径的顶点都被访问到; (3)检查是否有尚未访问顶点,若有则从未被访问的顶
点中任意选择一个顶点重复(1)和(2); (4)直至图中所有顶点都被访问到为止。
68
6 9∧
15 2
6
18 8
21 15 12
21
9
12 1
5
5 8 10
23 3 7 8 15
9
6
9 21 ∧
通过案例分析逐步推导 重点关注非连通图问题
7.3 图的遍历
1 2 3 4 5
6∧
7 8 9
2 12 4 15 58 8 18 2 5∧
5 23 9 15 ∧ 5 12
3 10 ∧ 8 6∧
相关文档
最新文档