图算法(BFS和DFS)

本文详细介绍了图的两种搜索算法——广度优先搜索(BFS)和深度优先搜索(DFS),包括算法介绍、性质、边的分类以及在拓扑排序和判断图中是否有环等问题上的应用。BFS适用于计算最短路径,DFS常用于找路径和判断环。文章还探讨了两种算法的时间复杂度和空间复杂度,以及在邻接表和邻接矩阵存储方式下的差异。

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

一、图的存储

对于图G=\left ( V,E \right )有两种存储方式。

邻接表:倾向于稀疏图(边的条数\left | E \right |远远小于\left | V \right |^{2}的图)时选择。存储空间:\Theta \left ( V+E \right )

邻接矩阵:倾向于稠密图(边的条数\left | E \right |接近\left | V \right |^{2}的图)时选择。存储空间:\Theta \left ( V^{2} \right )

邻接链表无法快速判断一条边\left ( u,v \right )是否是图中的一条边,邻接矩阵则可以,但是邻接矩阵存储空间消耗更高。

有向图的转置操作:G=\left ( V,E \right )的转置图G^{T}=\left ( V,E^{T} \right ),是将图G的所有边方向反过来。

        (1)若图以邻接表形式存储,时间复杂度:O\left ( V+E\right )

        (2)若图以邻接矩阵形式存储,时间复杂度:O\left ( V^{2} \right )

二、广度优先搜索(BFS)

1、BFS算法介绍

Prim的最小生成树算法和Dijkstra的单源最短路径算法都使用了类似广度优先搜索的思想。给定图G和一个可识别源结点s,BFS可以计算从源结点到每个可到达的结点的距离(最少的边数),同时生成一棵广度优先搜索树。在广度优先搜索树里从结点s到结点v的简单路径所对应的就是图G中从结点s到结点v最短路径,即包含最少边数的路径。该算法总是在发现所有距离源结点sk的所有结点后才会发现距离源结点sk+1的其他结点。

染色:在广度优先搜索过程中,在概念上将每个结点涂上白色、灰色或黑色。所有结点一开始均涂上白色。在算法运行过程中,结点被发现则颜色会发生改变。如果边\left ( u,v \right )中,结点u是黑色,则v不是黑色就是灰色。也即,与黑色结点邻接的结点都已被发现。对于灰色结点来说,其邻接结点中可能存在未被发现的白色结点。灰色结点所代表的就是已知和未知两个集合的边界

下面给出BFS在邻接表中的算法伪代码(我们将每个结点u的颜色存放在属性u.color中,将u的前驱结点/父结点存放在属性u.\pi中(记录路径),将BFS计算出的从源结点su的距离存放在属性u.d中,若us不可达,则u.d=\infty。该算法用队列Q存放灰色结点):

BFS(Gs

1       for each vertex u\in G.V-\left \{ s \right \}

               u.color=WHITE

3                u.d=\infty

4                u.\pi=NIL

5        s.color=GRAY

6        s.d=0

7        s.\pi=NIL

8        Q=\varnothing

9        ENQUEUE(Q,s)

10      while Q\neq \varnothing

11               u=DEQUEUE(Q)

12               for each v\in G.Adj[u]

13                        if v.color==WHITE

14                                v.color=GRAY

15                                v.d=u.d+1

16                                v.\pi=u

17                                ENQUEUE(Q,v)

18               u.color=BLACK

解释:1至8行进行初始化,第9行将源结点s入队(ENQUEUE为入队操作);10至18行进行while循环直至队列为空(无灰色结点)。该循环不断从队列中取出结点u(DEQUEUE出队操作),检查其邻接结点集合G.Adj[u]。若其邻接结点v为白色(未被发现),则涂灰,其距离属性v.du.d+1v的父结点为u,将v入队。直到u所有邻接节点都被发现,则其颜色标位黑色。

举例:

时间复杂度:邻接表存储:O\left ( V+E\right );邻接矩阵存储:O\left ( V^{2} \right )

分析(采用聚合分析):初始化操作O\left ( V \right ),每个结点入队出队最多一次,故入队出队操作总代价O\left ( V \right ),for循环的总次数不超过边数(但是这里需要注意,对于不同的存储方式,遍历邻接边的代价不同,邻接表为O\left ( E\right ),邻接矩阵为O\left ( V^{2} \right ))。则对于图的邻接表存储,广度优先搜索的代价为O\left ( V\right )+O\left (E \right )=O\left ( V+E \right );对于邻接矩阵为O\left ( V\right )+O\left (V^{2} \right )=O\left (V ^{2} \right )

2、引理和推论

下面我们将给出证明BFS正确性的一些引理和推论:

引理2.1:给定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值