算法设计学习笔记(三)

本文详细介绍了图的基本概念,包括无向图的连通性、宽度优先搜索(BFS)和深度优先搜索(DFS)。重点讲解了如何用BFS解决s-t连通性问题,以及DFS作为一般性分支扩张算法的实现。此外,还探讨了二分性测试,利用BFS判断图是否为二部图,并讨论了有向图的连通性和拓扑排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 基本定义与应用

:由结点集合V和边集合E构成,其中每条边与两个结点相交。

有向图可以表示不对称的关系

图的例子:运输网络,通信网络,信息网络,社会网络,依赖网络。

路径与连通性:存在一条从u到v的路径,称一个无向图是连通

如果对每两个结点u与v,都存在一条从u到v的路径和一条从v到u的路径,我们说一个有向图是强连通的。

:一个无向图如果是连通的,且不包含一个圈,我们就说它是一颗树。
树是最简单的连通图,删除树中的任意一条边将使得它不再连通。

命题3.1 每棵n个结点的树恰好由n-1条边。

定理3.2 设G是具有n个结点的无向图,下面任意两个语句都可以推出第三个语句。

(i)G是连通的

(ii)G不包含一个图

(iii)G有n-1条边。

二、图的遍历

s-t连通性问题也可以叫做迷宫求解问题。

1 宽度优先搜索

确定s-t连通性最简单的算法——宽度优先搜索(BFS)

定理3.3 对每个j≥1,由BFS产生的层 Lj 恰好由所有到s距离为j的结点组成,存在一条从s到t的路径,当且仅当t出现在某个层中。
(层 Lj 恰好是所有到s结点距离为j的结点的集合)
(BFS不仅确定了s可以达到的结点,也计算了他们的最短路径

定理3.4 设T是一颗宽度优先搜索树,设x和y是T中分别属于层 Li 和 Lj 的结点,并且设(x,y)是G的一条边,那么i与j至多差1。

探查一个连通分支:

从始点s可达的结点,将把这个集合R看作G的包含s的连通分支。(可回答s-t连通性问题)

定理3.5 在算法结束产生的集合R恰好是G的包含s的连通分支。

2 深度优先搜索

探查方式:尽可能深的前进并且只有必要的时候才撤退。

DFS——一般性分支扩张算法的实现方式。可用递归形式表述。

命题3.6 对于给定的递归调用DFS(u),在这次激活和这个递归调用结束之间呗标记为“Exprored”的所有的结点都是u在T中的后代。

定理3.7 设T是一颗深度优先搜索树,x与y是T中的结点,且(x,y)是G中不属于T的一条边,那么x或y之中一个是另一个的祖先。

定理3.8 对图中任两个结点s与t,它们的连通分支或者相等, 或者不相交。

三、 用优先队列与栈实现图的遍历

1 图的表示

图的两种表示方式:邻接矩阵与邻接表(稀疏图更有效)。

定理3.10 一个图的邻接矩阵表示需要O(n2)的空间,而邻接表表示只需要O(m+n)的空间。

2 队列与栈

队列:先进先出 ——适用于BFS

栈:后进先出——适用于DFS

3 宽度优先搜索的实现
BFS(s):
	置Discovered[s] = true 且对所有其他的v,Discovered[v] = false
	初始化L[0]由单个元素s构成
	置层计数器i=0
	置当前的BFS树T=Φ
	While L[i] 不空
		初始化一个空表L[i+1]
		For 每个结点u∈L[i]
			考虑每条关联到u的边(u,v)
			if Discovered[v] = false then
				置Discovered[v] = true
				把边(u,v)加到树T上
				把v加到表L[i+1]
			endif
		endfor
		层计数器++
	endwhile

定理3.11 如果图是由邻接表表示给出的,BFS算法的上述实现将以O(m+n)时间(即以输入规模的线性时间)运行

4 深度优先搜索的实现
DFS(s):
	初始化S为具有一个元素s的栈
	While S非空
		从S中取一个结点u
		if Explored[u]=false then
			置 Explored[u] = true
			for 每条与u关联的边(u,v)
				把v加到栈 S
			Endfor
		Endif
	Endwhile

定理3.12 上述算法在下面的意义上实现DFS:它按照与递归的DFS过程恰好相同的次序(除了每个邻接表是按照相反的次序处理之外)访问结点。

定理3.13 如果图是由邻接表表示给出的,那么上述DFS算法的实现将以O(m+n)时间(即输入规模的线性时间)运行。

四、 二分性测试:宽度优先搜索的一个应用

二部图:是一个图,其结点集V可以用下述方式划分成集合X与Y,每条边的一端在X中而另一端在Y中。

1 问题

定理3.14 如果一个图是二部图,那么它不可能包含一个奇圈。

问题:确定一个图是二部图。

2 设计算法

给结点着色,如结点s为红色,则与s相邻的结点必须着蓝色
如果存在一条边两端颜色相同,则G不为二部图

BFS —— 一层为蓝一层为红。

3 分析算法

定理3.15 设G是一个连通图,令L1,L2,……是由始于结点s的BFS所产生的层,那么下面两件事一定恰好成立其一:

(i)G中没有边与同一层的两个结点相交,在这种情况下G是二部图,其中偶数层的结点可以着红色,奇数层结点可以着蓝色。

(ii)G中有一条边与同一层的两个结点相交,在这种情况下,G包含一个奇数长度的圈,且因此不可能是二部图。

五、有向图中的连通性

1 有向图的表示

邻接表

2 图搜索算法

与无向图类似,可使用BFS、DFS

3 强连通性

命题3.16 如果u和v是相互可达的,v和w是相互可达的,那么u和w也是相互可达的。

命题3.17 对有向图中的任何两个结点s和t,它们的强连通分支或者相等,或者不相交。

4 有向无圈图与拓扑排序

无向图没有圈——树

有向图没有圈——有向无圈图(DAG)

1) 问题

定理3.18 如果G有一个拓扑排序,那么G是一个DAG。

**问题:**每个DAG都有一个拓扑排序吗?怎样有效找到一个。(将证明对任务集上的任意五圈的优先关系,存在一个有效计算的执行任务的次序)。

2) 设计与分析算法

命题3.19 在每个DAG中,存在一个没有输入边的结点。

定理3.20 如果G是一个DAG,那么G有一个拓扑排序。

拓扑排序:

	计算G的拓扑排序:
		找到一个没有进入边的结点v并且将它排在第一
		从G中删除v
		递归计算G-{v}的拓扑排序并把这个序接在v的后面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值