BFS计算最短路径(python)

我们这里所说的最短路径是从根节点到某一指定叶子节点的最短路径。

 如上图,我们把E,当成根节点,我们到B的最短路径就是ECB。

我们用代码来实现。我们用到的思路就是使用一个字典来存放节点的父节点,仔细看parent和ver 的关系,ver是取到的队头元素,我们用for循环在grep[ver]中找到子元素,所以我们可以反过来用parent[i] = ver 来存放子对父的key_value。

grap = {
    "A": ["B", "C"],
    "B": ["A", "C", "D"],
    "C": ["A", "B", "D", "E"],
    "D": ["B", "C", "E", "F"],
    "E": ["C", "D"],
    "F": ["D"]
}


# 存图

def BFS(grap, star):                    # BFS算法
    queue = []                          # 定义一个队列
    seen = set()                        # 建立一个集合,集合就是用来判断该元素是不是已经出现过
    queue.append(star)                  # 将任一个节点放入
    seen.add(star)                      # 同上
    parent = {star:None}                #存放parent元素
    while (len(queue) > 0):             # 当队列里还有东西时
        ver = queue.pop(0)              # 取出队头元素
        notes = grap[ver]               # 查看grep里面的key,对应的邻接点
        for i in notes:                 # 遍历邻接点
            if i not in seen:           # 如果该邻接点还没出现过
                queue.append(i)         # 存入queue
                seen.add(i)             # 存入集合
                parent[i] = ver         #将元素对应的parent元素存入字典中
    return parent


parent = BFS(grap, "E")
a = 'B'
while a != None:
    print(a)
    a = parent[a]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值