Chapter 6 图的遍历
北邮数据结构第六章答案详解 图(1)

1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
图的遍历及生成树

• •邻接表的DFS算法
void DFS(ALGraph G, int v) { ArcNode *p;
visited[v] = 1; /*置已访问标记*/ printf("%d ", v); /*输出被访问顶点的编号*/ p = G.vertices[v].firstarc; /*p指向顶点v的第一个邻接点*/ while (p!=NULL) {
•v11
•v1,
•v2
•v3
•v2,
•v4,
•v5
•v8,
•v4
•v6
•v7
•v5,
•v3,
•v8
•v6,
•v7
•
•图的DFS算法一般描述
•int visited[MAXVEX]; //访问标志数组
•void DFSTraverse(Graph G)
•{ //对图G作深度优先遍历
• for( v=0; v<G.vexnum; ++v ) visited[v]=FALSE;
•} // DFS1
•G.arcs[v][j] =1
•有邻接点
•visited [n]=0
•未访问过
•
分析:
在遍历图时,对图中每个顶点至多调用一次DFS函数 ,因为一旦某个顶点被标志成已被访问,就不再从它出发 进行搜索。
因此,遍历图的过程实质上是对每个顶点查找其邻接 点的过程。其耗费的时间则取决于所采用的存储结构。 如果用邻接矩阵来表示图,遍历图中每一个顶点都要从 头扫描该顶点所在行,因此遍历全部顶点所需的时间为 O(n2)。 如果用邻接表来表示图,虽然有 2e 个表结点,但只需扫 描 e 个结点即可完成遍历,加上访问 n个头结点的时间, 因此遍历图的时间复杂度为O(n+e)。
图的遍历问题

HUNAN UNIVERSITY数据结构实验报告题目:图的遍历问题学生姓名梁天学生学号************专业班级计科1403指导老师夏艳日期2016.05.14背景网络蜘蛛即Web Spider,是一个很形象的名字。
把互联网比喻成一个蜘蛛网,那么Spider 就是在网上爬来爬去的蜘蛛。
网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
这样看来,网络蜘蛛就是一个爬行程序,一个抓取网页的程序。
在抓取网页的时候,网络蜘蛛一般有两种策略:广度优先和深度优先(如下面这张简单化的网页连接模型图所示,其中A为起点也就是蜘蛛索引的起点)。
深度优先顾名思义就是让网络蜘蛛尽量的在抓取网页时往网页更深层次的挖掘进去讲究的是深度!也泛指: 网络蜘蛛将会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接! 则访问的节点顺序为==> A --> B --> E --> H --> I --> C --> D --> F --> K --> L --> G。
深度爬行的优点是:网络蜘蛛程序在设计的时候相对比较容易些;缺点是每次爬行一层总要向"蜘蛛老家" 数据库访问一下。
问问老总有必要还要爬下一层吗! 爬一层问一次.... 如果一个蜘蛛不管3721不断往下爬很可能迷路更有可能爬到国外的网站去,不仅增加了系统数据的复杂度更是增加的服务器的负担。
广度优先在这里的定义就是层爬行,即一层一层的爬行,按照层的分布与布局去索引处理与抓取网页。
则访问的节点顺序为==> A --> B --> C --> D --> E --> F --> G --> H --> I--> K --> L。
第6章 图习题参考答案

习题六参考答案一、选择题1.在一个有个顶点的有向图中,若所有顶点的出度之和为,则所有顶点的入度之和为(A)。
A. B. C. D.2.一个有向图有个顶点,则每个顶点的度可能的最大值是(B)。
A. B. C. D.3.具有6个顶点的无向图至少应有(A)条边才能确保是一个连通图。
A.5B.6C.7D.84.一个有n个顶点的无向图最多有(C)条边。
A. B. C. D.5.对某个无向图的邻接矩阵来说,下列叙述正确的是(A)。
A.第行上的非零元素个数和第列上的非零元素个数一定相等B.矩阵中的非零元素个数等于图中的边数C.第行与第列上的非零元素的总数等于顶点的度数D.矩阵中非全零行的行数等于图中的顶点数6.已知一个有向图的邻接矩阵,要删除所有以第个顶点为孤尾的边,应该(B)。
A.将邻接矩阵的第行删除B.将邻接矩阵的第行元素全部置为0C.将邻接矩阵的第列删除D.将邻接矩阵的第列元素全部置为07.下面关于图的存储的叙述中,哪一个是正确的?……(A)A.用邻接矩阵存储图,占用的存储空间只与图中顶点数有关,而与边数无关B.用邻接矩阵存储图,占用的存储空间只与图中边数有关,而与顶点数无关C.用邻接表存储图,占用的存储空间只与图中顶点数有关,而与边数无关D.用邻接表存储图,占用的存储空间只与图中边数有关,而与顶点数无关8.对图的深度优先遍历,类似于对树的哪种遍历?……(A)A.先根遍历B.中根遍历C.后根遍历D.层次遍历9.任何一个无向连通图的最小生成树(B)。
A.只有一棵B.有一棵或多棵C.一定有多棵D.可能不存在10.下面是三个关于有向图运算的叙述:(1)求两个指向结点间的最短路径,其结果必定是唯一的(2)求有向图结点的拓扑序列,其结果必定是唯一的(3)求AOE网的关键路径,其结果必定是唯一的其中哪个(些)是正确的?……(D )A.只有(1)B.(1)和(2)C.都正确D.都不正确二、填空题1.若用表示图中顶点数,则有条边的无向图称为完全图。
图的各种算法(深度、广度等)

vex next 4 p
3
2 ^
2
^
5
5 5 4 3 2 1 0 ^
^
4 ^
top
4
输出序列:6 1
1 2 3 4 5 6
in link 0 2 ^ 1 0 2 0
vex next 4 p
3
2 ^
2
^
5
5 5 4 3 2 1 0 ^
^
4 ^
top 4
输出序列:6 1
1 2 3 4 5 6
in link 0 2 ^ 1 0 2 0
c a g b h f d e
a
b h c d g f
e
在算法中需要用定量的描述替代定性的概念
没有前驱的顶点 入度为零的顶点 删除顶点及以它为尾的弧 弧头顶点的入度减1
算法实现
以邻接表作存储结构 把邻接表中所有入度为0的顶点进栈 栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找 Vj的直接后继Vk,把Vk的入度减1;若Vk的入度为0 则进栈 重复上述操作直至栈空为止。若栈空时输出的顶点个 数不是n,则有向图有环;否则,拓扑排序完毕
^
4
^
top
输出序列:6 1 3 2 4
1 2 3 4 5 6
in link 0 0 ^ 0 0 0 0
vex next 4
3
2 ^
2
^
5
5 5 4 3 2 1 0 ^ p
^
4
^topBiblioteka 5输出序列:6 1 3 2 4
1 2 3 4 5 6
in link 0 0 ^ 0 0 0 0
vex next 4
w2 w1 V w7 w6 w3
实验六 图及其应用

实验六图及其应用数据结构实验六图及其应用1、实验目的? 熟练掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法 ? 掌握图的基本运算及应用? 加深对图的理解,逐步培养解决实际问题的编程能力2、实验内容:采用邻接表或邻接矩阵方式存储图,实现图的深度遍历和广度遍历;用广度优先搜索方法找出从一顶点到另一顶点边数最少的路径。
1.问题描述:利用邻接表存储结构,设计一种图(有向或无向),并能够对其进行如下操作:1) 创建一个可以随机确定结点数和弧(有向或无向)数的图; 2) 根据图结点的序号,得到该结点的值;3) 根据图结点的位置的第一个邻接顶点的序号,以及下一个邻接顶点的序号;4) 实现从第v 个顶点出发对图进行深度优先递归遍历; 5) 实现对图作深度优先遍历;6) 实现对图进行广度优先非递归遍历; 编写主程序,实现对各不同的算法调用。
2.实现要求:(以邻接表存储形式为例)编写图的基本操作函数::对图的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
1)“建立图的邻接表算法”:CreateGraph(ALGraph *G) 操作结果:采用邻接表存储结构,构造没有相关信息的图G2)“邻接表表示的图的递归深度优先遍历算法”:DFSTraverse(ALGraphG,void(*Visit)(char*)) 初始条件:图G 已经存在;操作结果:返回图的按深度遍历的结果。
3)“邻接表表示的图的广度优先遍历算法”: BFSTraverse(ALGraphG,void(*Visit)(char*)) 初始条件:图G 已经存在;操作结果:返回图的按广度遍历的结果。
4)“邻接表从某个结点开始的广度优先遍历算法”:BFS(ALGraph G, int v)初始条件:图G 已经存在;操作结果:返回图从某个结点开始的按广度遍历的结果。
分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
数据结构第六章图理解练习知识题及答案解析详细解析(精华版)

图1. 填空题⑴设无向图G中顶点数为n,则图G至少有()条边,至多有()条边;若G为有向图,则至少有()条边,至多有()条边。
【解答】0,n(n-1)/2,0,n(n-1)【分析】图的顶点集合是有穷非空的,而边集可以是空集;边数达到最多的图称为完全图,在完全图中,任意两个顶点之间都存在边。
⑵任何连通图的连通分量只有一个,即是()。
【解答】其自身⑶图的存储结构主要有两种,分别是()和()。
【解答】邻接矩阵,邻接表【分析】这是最常用的两种存储结构,此外,还有十字链表、邻接多重表、边集数组等。
⑷已知无向图G的顶点数为n,边数为e,其邻接表表示的空间复杂度为()。
【解答】O(n+e)【分析】在无向图的邻接表中,顶点表有n个结点,边表有2e个结点,共有n+2e个结点,其空间复杂度为O(n+2e)=O(n+e)。
⑸已知一个有向图的邻接矩阵表示,计算第j个顶点的入度的方法是()。
【解答】求第j列的所有元素之和⑹有向图G用邻接矩阵A[n][n]存储,其第i行的所有元素之和等于顶点i的()。
【解答】出度⑺图的深度优先遍历类似于树的()遍历,它所用到的数据结构是();图的广度优先遍历类似于树的()遍历,它所用到的数据结构是()。
【解答】前序,栈,层序,队列⑻对于含有n个顶点e条边的连通图,利用Prim算法求最小生成树的时间复杂度为(),利用Kruskal 算法求最小生成树的时间复杂度为()。
【解答】O(n2),O(elog2e)【分析】Prim算法采用邻接矩阵做存储结构,适合于求稠密图的最小生成树;Kruskal算法采用边集数组做存储结构,适合于求稀疏图的最小生成树。
⑼如果一个有向图不存在(),则该图的全部顶点可以排列成一个拓扑序列。
【解答】回路⑽在一个有向图中,若存在弧、、,则在其拓扑序列中,顶点vi, vj, vk的相对次序为()。
【解答】vi, vj, vk【分析】对由顶点vi, vj, vk组成的图进行拓扑排序。
第6章 图习题解析

第六章图习题解析1一、选择题1、设无向图的顶点个数为n,则该无向图最多有 B 条边。
A、n-1B、n(n-1)/2C、n(n+1)/2D、0E、n22、在下列两种求图的最小生成树的算法中,B 算法适合于求边稀疏的网的最小生成树。
A、PrimB、Kruskal3、下面的叙述中不正确的是 B 。
A、关键活动不按期完成就会影响整个工程的完成时间B、任何一个关键活动提前完成,将使整个工程提前完成C、所有关键活动都提前完成,则整个工程将提前完成D、某些关键活动若提前完成,将使整个工程提前完成4、采用邻接表存储的图,其深度优先遍历类似于二叉树的 B 。
A、中序遍历B、先序遍历C、后序遍历D、按层次遍历5、采用邻接表存储的图,其广度优先遍历类似于二叉树的 A 。
A、按层次遍历B、中序遍历C、后序遍历D、先序遍历6、具有n个顶点的有向图最多有 B 条边。
A、nB、n(n-1)C、n(n+1)D、n27、一个n个顶点的连通无向图,其边的个数至少为 A 。
A、n-1B、nC、n+1D、nlog2n8、下列说法中,正确的有 C 。
A、最小生成树也是哈夫曼树B、最小生成树唯一C、普里姆最小生成树算法时间复杂度为O(n2)D、克鲁斯卡尔最小生成树算法普里姆算法更适合与边稠密的网。
10、判定一个有向图是否存在回路,除了可以利用拓扑排序的方法外,还可以利用 C 。
A、求关键路径的方法B、求最短路径的Dijkstra方法C、深度优先遍历算法D、广度优先遍历算法11、在一个具有n个顶点的有向图中,若所有顶点的出度之和为s,则所有顶点的入度之和为 A 。
A、sB、s-1C、s+1D、n12、在一个无向图中,若两个顶点之间的路径长度为k,则该路径上的顶点数为 B 。
A、kB、k+1C、k+2D、2k13、一个有n个顶点的无向连通图,它所包含的连通分量个数为 B 。
A、0B、1C、nD、n+114、对于一个有向图,若一个顶点的入度为k1、出度k2,则对应邻接表中该顶点单链表中的结点数为 B 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前向边
回边
Case 2: 从顶点a开始, 依次访问a,f,e,b; c,d
横跨边
1,4 a
5,6
2,3 b
c
e 3,1
1,4 a
5,6
2,2 f
c
b 4,3
4,2 f
d
3,1 e
d
6,5
6,5
南京理工大学
时间复杂度分析
• 假设图有n个顶点,m条边。 • (m+n)
南京理工大学
DFS 时间复杂度分析(有向图)
南京理工大学
6 图遍历 Graph Traversal
南京理工大学
• 图的遍历是求解图问题的基础。 • 和树的遍历类似,图的遍历希望从图中某一顶点出发,
对其余各个顶点都访问一次,但比树的遍历要复杂得 多。
• 图的任一顶点都有可能和其余顶点相邻接,因此在访 问了某顶点后,可能沿着某条路径搜索以后,又回到 该顶点。
• 树边(Tree edges)- 深度优先搜索生成树中的边:探测边(v,w)时,w是 “unvisited”状态,则边(v,w)是树边。
• 回边(Back edges)-在迄今为止所构建的深度优先搜索生成树中,w是 v的祖先,并且在探测(v,w)时,w已经被标记为”visited”,则(v,w)为回边。
1,10 a
2,9 b
f
6,8
3,3 c
d
a
i
g 7,7
c
b
g
h
e
f
j
d 4,2
h 8,6
e
5,1 树边
i 9,5
回边
j 10,4
postdfn=1: 该顶点是第一个不能继续向深度前进的顶点; 或是称为第一个完成深度搜索的顶点。
南京理工大学
有向图情形
• 有向图G= (V,E),深度优先遍历后,会生成一个或是多个(有向)深度 优先搜索生成树,树的多少取决于起始点的选择。G中的边可以分为 如下4种类型:
2
3/
4/
1. visited[v] ←true 2. predfn←predfn+1
n
1
2
3/
3. for (v,w)∈E //每条边检测一次,即 v→w 时
4. if visited[w]=false then dfs(w) 5. end for 6. postdfn←postdfn+1
南京理工大学
关于有向图 DFS 遍历时“每条边检测一次”的图释
b
X e
a
a
b/
b
e/
e
a/
假如将本图变成无向图,则(b,e)和(e,b)各被检测一次。 因此,有向图 DFS 遍历时,每条边只检测一次。
dfs(v) 1. visited[v] ←true 2. predfn←predfn+1 3. for (v,w)∈E 4. if visited[w]=false then dfs(w) 5. end for 6. postdfn←postdfn+1.
南京理工大学
• 深度优先搜索生成树(depth-first search spanning tree) • 深度优先搜索生成森林(depth-first search spanning forest) • predfn:在图的深度优先搜索生成树(森林)中顶点的先序号。所谓先序
号,是指按照先序方式访问该生成树,该顶点的序号。 • postdfn:在图的深度优先搜索生成树(森林)中顶点的后序号。所谓后
序号,是指按照后序方式访问该生成树,该顶点的序号。 • 边(v,w)已被探测,含义是:在调用dfs(v)的过程中,检查(v,w)以测试
w是否已经被访问过(”visited”)。
继续选择与x相邻且未被访问的顶点。 5. 此过程一直进行,直到发现一个顶点y,邻接于y的所有顶点都已经被
标记为”visited”。此时,返回到最近访问的顶点,不妨称之为z,然后 访问和z相邻且标记为”unvisited”的顶点。 6. 上述过程一直进行,直到返回到起始顶点v。
南京理工大学
输入:无向图或有向图G= (V,E) 输出:深度优先搜索树(森林)中每个顶点的先序号、后序号 1. predfn←0; postdfn←0 //计数器,在使用DFS解决某些实际问题时用到 2. for v∈V 3. visited[v] ← false 4. end for 5. for v∈V //从一个顶点v出发,可能无法遍历全部顶点 6. if visited[v] = false then dfs(v) 7. end for
• 通常有两种遍历图的方法:深度优先搜索、广度优先 搜索。他们都适合于无向图和有向图。
• 本章重点内容是图遍历算法的复杂度分析,并学习图 遍历算法的一些应用。
南京理工大学
图的两种遍历方法
• 深度优先搜索(Depth-First Search, DFS) • 宽度优先搜索(Breadth-First Search, BFS)
南京理工大学
深度优先搜索(Depth-First Search, DFS)
给定有向或是无向图G=(V,E),DFS工作过程如下: 1. 将所有的顶点标记为”unvisited”。 2. 选择一个起始顶点,不妨称为v ∈V,并将之标记为”visited”。 3. 选择与v相邻的任一顶点,不妨称之为w,将w标记为”visited”。 4. 继续选择一个与w相邻且未被访问的顶点作为x;将x标记为”visited”。
1. predfn←0; postdfn←0
2. for v∈V
// (n), 因|V|=n
3. visited[v] ← false 4. end for
5. for v∈V
//调用 n 次
6. if visited[v] = false then dfs(v)
7. end for
1
2
dfs(v)过程
南京理工大学
无向图情形
• 无向图G= (V,E),深度优先遍历后,G中的边可以分为如下类型: • 树边(Tree edges)- 深度优先搜索生成树中的边:探测边(v,w)时,
w是“unvisited”状态,则边(v,w)是树边。 • 回边(Back edges)-G中除却树边的所有其它边。
南京理工大学
• 前向边(Forward edges)-在迄今为止所构建的深度优先搜索生成树中, w是v的后裔,并且在探测(v,w)时,w已经被标记为”visited”,则(v,w)为 前向边。
• 横跨边(Cross edges)-所有其他的边。
南京理工大学
c
b
a
d
e
f
பைடு நூலகம்树边
Case 1: 从顶点a开始, 依次访问a,b,e,f; c,d