图---广度优先搜索(BFS)

图—广度优先搜索(BFS)

Breadth First Search是搜索图的最简单算法之一,

  1. 给定图G,以及开始搜索的起始顶点s
  • BFS搜索所有从s可到达顶点的边,而且在达到更远的距离k+1的顶点之前,BFS会找到全部距离为k的顶点
  • 可以想象为以s为根,构建一棵树的过程,从顶部向下逐步增加层次
  • 广度优先搜索能保证在增加层次之前,添加了所有兄弟结点到树中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJuXE9FK-1614326400529)(C:\Users\93623\AppData\Roaming\Typora\typora-user-images\image-20210219144349084.png)]

  1. 从Fool开始搜索

  2. 为了跟踪顶点的加入过程,并避免重复顶点,要为顶点增加3个属性

  • 距离distance:从起始顶点到此顶点路径长度
  • 前驱顶点predecessor:可反向追溯到起点
  • 颜色:标识了此顶点是尚未发现(白色),已经发现(灰色), 还是已经完成探索, 还是已经完成探索(黑色)
  1. 还需要用一个队列queue来对已发现的顶点进行排列

  2. 决定下一个要探索的顶点(队首顶点)

  3. 从起始顶点s开始,作为刚发现的顶点,标注为灰色,距离为0,前驱为None,加入队列,下面是循环迭代过程:

  • 从队首取出一个顶点作为当前顶点;
  • 遍历当前顶点的邻接顶点,如果是尚未发现的白色顶点,则将其颜色改为灰色(已发现),距离增加1,前驱顶点为当前顶点,加入到队列中遍历完成后,将当前顶点设置为黑色,循环回到步骤1的队首取当前顶点
def bfs(g, start):
    start.setDistance(0)
    start.setPred(None)
    vertQueue = Queue()
    vertQueue.enqueue(start)
    while vertQueue.size() > 0:
        currentVert = vertQueue.dequeue()
        for nbr in currentVert.getConnections():
            if nbr.getColor() == 'white':
                nbr.setColor('gray')
                nbr.setDistance(currentVert.getDistance()+1)
                vertQueue.enqueue(nbr)
        currentVert.setColor('black')
  1. BFS算法主体是两个循环的嵌套

    while循环对每个顶点访问一次,所以是 O ( ∣ v ∣ ) \mathbf{O}(|\mathbf{v}|) O(v),而嵌套在while中的for,由于每条边只有在其其实顶点u出队的时候才会被检查一次,而每个顶点最多出队1次,所以边最多被检查1次,一共是 O ( ∣ E ∣ ) \mathbf{O}(|\mathbf{E}|) O(E),综合起来BFS的事件复杂度为 0 ( ∣ v ∣ + ∣ E ∣ ) 0(|v|+|E|) 0(v+E)

PS:

词梯文件被存在的地址是 : http://gis4g.pku.edu.cn/course/pythonds/#%E8%AF%BE%E7%A8%8B%E8%B5%84%E6%BA%90 你可以复制网址.在浏览器中打开上面的网址.并在打开的网页中搜索(CTRL+F)关键词 : 字母单词表. 之后,就可以找到一个压缩包.下载到本地并解压它就会得到文章代码所需要的词梯文件.希望回复及时
<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值