基本图算法之广度优先搜索

本文介绍了广度优先搜索算法的基本原理及其应用。该算法适用于无向图和有向图,能够找到从源结点到其他结点的最短路径。通过使用队列管理待访问结点,广度优先搜索确保了按距离顺序探索结点。

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

广度优先搜索是最简单的图搜索算法之一,输入是图G=(V,E)和一个给定的源结点s。输出是一颗广度优先搜索树,该树以s为根结点,包含所有从s可以到达的节点。既可以适用于无向图,也适用于有向图

广度优先搜索会沿其广度方向向外扩展,算法会在发现所有距离源结点s为k的所有结点后,才会发现距离s为k+1的其他结点。

假设图是邻接链表表示,每个结点有额外的三个属性,color值是一个标记值,color为白色是,该结点未访问过,为灰色时,访问过但未访问完,即还未找出该结点的所有子结点,为黑色时,已完全访问完。d值是结点与源结点的距离。p值是该结点的前驱结点。需要一个先进先出的队列Q来管理灰色结点。

广度优先的伪码如下:

BFS(G,s)
for each vertex u  in G.V-{s}
   u.color=WHITE
   u.d=∞
   u.p=NIL
s.color=GRAY
s.d=0
s.p=NIL
Q =∅//初始化一个空队列Q
ENQUEUE(Q,s)   //入队
while Q.length>0
u=DEQUEUE(Q)   //出队
for each v in G.Adj[u]
   if v.color==WHITE
       v.color=GRAY
       v.d=u.d+1
       v.p=u
       ENQUEUE(Q,v)
u.color=BLACK

注意该算法并不能访问到图G的所有结点

每个结点的入队出队操作最多一次,入队和出队的时间都为O(1),因此对队列操作的总时间为O(v),

算法在结点出队时对其邻接链表进行扫描,因此每个邻接链表最多只扫描一次,用于扫描邻接链表的时间为O(E),

初始化结点属性的时间为O(v),

因此广度优先搜索总时间为O(V+E),因此广度优先搜索的运行时间是图G的邻接链表大小的一个线性函数。

如果改变图G邻接链表中各个结点的顺序,即改变搜索顺序,算法结束后,color值不变,p值变,d值不变
广度优先搜索后的d值为s到该结点的最短路径距离,当然不变啦,p值变化是因为可能有多条最短路径存在。

广度优先搜索的思想与PRIM,Dijkstra相似,都是从一个边界向外扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值