17.广度优先搜索(BFS)算法

广度优先搜索(BFS)算法用于图中从源顶点s出发,系统地搜索所有可达顶点并计算s到所有这些顶点的最短路径。在搜索过程中,顶点经历白色、灰色、黑色三个状态。算法使用邻接表表示图,通过一个先进先出队列来处理灰色顶点,并维护每个顶点的颜色、父节点信息和距离。伪代码描述了BFS的具体步骤,包括顶点的着色、距离更新和队列操作。

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

已知图G=(V,E)和一个源顶点s,广度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的广度优先树。

算法首先搜索和s相邻的顶点v,然后再去搜索相邻顶点v的其他相邻顶点。

为了保持搜索的轨迹,广度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说该顶点被发现,此时该顶点变为灰色。其中灰色和黑色顶点都已被发现。在宽度优先树中,我们称结点u是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有--个父母结点。

下面的广度优先搜索过程BFS假定输入图G=(V,E)采用邻接表表示,对每个顶点u∈V,其色彩存储于变量color[u]中,结点u的父节点存于变量π[u]中。如果u没有父节点例如u=s或u还没有被检索到),则 π[u]=NIL,源点s和顶点u之间的距离存于变量d[u]中,算法中使用了一个先进先出队列Q来存放灰色节点集合。其中Enqueue(Q,v)表示将元素v入队, Dequeue(Q)表示对头元素出队;Adj[u]表示图中和u相邻的节点集合。

算法伪代码:

BFS(G,s)

1.    for 每个顶点u∈V[G]-{s}

2.      do color[u]<-WHITE

3.           d[u]<-∞

4.           π[u]<-NIF

5.    color[s]<-GRAY

6.    d[s]<-0

7.    Q<-∅

8.    Enqueue(Q,s)  //将变灰色的点放入Q中

9.    while Q≠∅  //如果Q没有变空就继续循环下去

10.       do u<-Dequeue(Q) //将Q中第一个元素放到u中

11.            for each v∈Adj[u] //u旁的每个相邻顶点

12.               do if color[v]=WHITE

13.                   then color[v]<-GRAY

14.                            π[v]<-u  //放入父节点

15.                            d[v]<-d[u]+1 //距离增加一条边

16.                            Enqueue(Q,v)

17.        color[u]<-BLACK //将父节点或者已经没有子节点的顶点标黑

18.   return π and d

下图就是一个说明:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值