BFS(广度优先搜索来啦)

一、BFS简介
二、BFS解决问题
三、代码实现

一、BFS简介

BFS即breadth-first search,又称为宽度优先搜索,是最简便的图的搜索算法之一,它是使用队列来实现的
已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。
之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和未找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。

二、BFS解决问题

BFS可以解决两类问题:
第一类问题:从节点A出发,有前往节点B的路径吗?
第二类问题:从节点A出发,前往节点B的哪条路径最近?

三、代码实现

我们以一个人的朋友圈中有没有芒果销售商为例,进行广度优先遍历。

from collections import deque

def persion_is_seller(name):
    return name[-1] == 'm'   # 假设一个人如果姓名以m结尾,那他就是芒果销售商

graph={}
graph['you'] = ['alice', 'bob', 'claire']
graph['bob'] = ['anuj', 'peggy']
graph['alice'] = ['peggy']
graph['claire'] = ['thom', 'jonny']
graph['anuj'] = []
graph['jonny'] = []
graph['peggy'] = []
graph['thom'] = []

def BFS(name):
    search_queue = deque()
    search_queue += graph[name]
    searched = []
    while search_queue:
        # 注:popleft是弹出第一个元素,是在队列中使用的,括号里不可用带参数
        # pop是弹出最后一个元素,是用于栈的出栈的,括号里可以带参数
        person = search_queue.popleft()
        if person not in searched:
            if persion_is_seller(person):
                print(person + ' is a mango seller')
                return True
            else:
                search_queue += graph[person]
                searched.append(person) # 已经遍历过的要做标记,以防止出现无线循环的情况
    return False

BFS('you')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值