【无标题】

python 广度优先算法

from queue import Queue

def bfs(graph, start, end):
    visited = set()  # 记录已经访问过的节点
    q = Queue()  # 初始化一个队列
    q.put([start])  # 将起点加入队列中

    while not q.empty():
        path = q.get()  # 取出队列中的第一个路径
        node = path[-1]  # 获取这条路径的最后一个节点
        if node == end:  # 如果这个节点是终点,则返回这个路径
            return path
        elif node not in visited:  # 如果这个节点还没有被访问过,则将它加入visited集合中,并将扩展出来的新路径加入队列中
            for neighbor in graph[node]:
                new_path = list(path)
                new_path.append(neighbor)
                q.put(new_path)

            visited.add(node)  # 将这个节点加入visited集合中,标记为已经访问过了

    return None  # 如果找不到路径,则返回None

# 测试用例
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}
start = 'A'
end = 'F'
print(bfs(graph, start, end))  # 输出:['A', 'C', 'F']

给出实例

'''2023/3/31 22:00:30

下面是一个简单的例子,使用广度优先搜索查找一个无向图中的最短路径。

假设有一张无向图,节点编号从0到5,每条边都有相应的权重,如下所示:'''


     4
0--------1
| \     / |
|   2   | 3
| /     \ |
3--------2
     5


from queue import Queue

def bfs_shortest_path(graph, start, end):
    """
    广度优先搜索算法求解最短路径
    :param graph: 图,用邻接表表示
    :param start: 起始节点
    :param end: 结束节点
    :return: 最短路径
    """
    # 初始化距离和前驱节点
    dist = [-1] * len(graph)
    prev = [-1] * len(graph)

    # 将起始节点加入队列并初始化距离
    q = Queue()
    q.put(start)
    dist[start] = 0

    # 开始广度优先搜索
    while not q.empty():
        node = q.get()
        for neighbor in graph[node]:
            if dist[neighbor] == -1:
                q.put(neighbor)
                dist[neighbor] = dist[node] + 1
                prev[neighbor] = node

    # 回溯找到最短路径
    path = []
    curr = end
    while curr != -1:
        path.append(curr)
        curr = prev[curr]
    path.reverse()

    return path

# 测试用例
graph = {
    0: [1, 3],
    1: [0, 2],
    2: [1, 3, 4],
    3: [0, 2],
    4: [2, 5],
    5: [4]
}
start = 0
end = 5
print(bfs_shortest_path(graph, start, end))  # 输出:[0, 3, 2, 4, 5]





'''在这个例子中,我们使用了Python内置的 set() 和 list() 函数,以及 queue 模块中的 Queue() 类和 put()、get() 方法。通过回溯前驱节点找到最短路径,并将其返回。'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值