数据结构与算法之 leetcode 队列广度优先 图最短路径

数据结构与算法阿木 发布于 2025-07-12 9 次阅读


队列广度优先搜索(BFS)在LeetCode图最短路径问题中的应用

在计算机科学中,图是一种非常常见的数据结构,用于表示实体之间的关系。图的应用非常广泛,如社交网络、网络拓扑、地图导航等。在图论中,最短路径问题是一个经典问题,旨在找到图中两点之间的最短路径。广度优先搜索(BFS)是一种有效的图遍历算法,可以用来解决图的最短路径问题。本文将围绕队列广度优先搜索在LeetCode图最短路径问题中的应用进行探讨。

广度优先搜索(BFS)简介

广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,逐层遍历树的节点,直到找到目标节点或遍历完所有节点。在图的数据结构中,BFS可以用来找到两个节点之间的最短路径。

BFS的基本思想是使用一个队列来存储待访问的节点。每次从队列中取出一个节点,访问它,并将其所有未访问过的邻接节点加入队列。这个过程一直持续到队列为空。

队列数据结构

在BFS中,队列是一种常用的数据结构。队列是一种先进先出(FIFO)的数据结构,意味着最先进入队列的元素将最先被访问。

以下是一个简单的队列实现:

python

class Queue:


def __init__(self):


self.items = []

def is_empty(self):


return len(self.items) == 0

def enqueue(self, item):


self.items.append(item)

def dequeue(self):


return self.items.pop(0)

def size(self):


return len(self.items)


BFS在图最短路径问题中的应用

在图的最短路径问题中,我们可以使用BFS来找到两个节点之间的最短路径。以下是一个使用BFS解决图最短路径问题的步骤:

1. 创建一个队列,用于存储待访问的节点。

2. 创建一个字典,用于存储每个节点的前驱节点,以便在找到最短路径时回溯。

3. 创建一个布尔数组,用于标记节点是否已被访问。

4. 将起始节点加入队列,并将其标记为已访问。

5. 当队列为空时,算法结束。

6. 从队列中取出一个节点,访问它,并将其所有未访问过的邻接节点加入队列,并记录它们的前驱节点。

7. 重复步骤5和6,直到找到目标节点或遍历完所有节点。

以下是一个使用BFS解决图最短路径问题的Python代码示例:

python

from collections import deque

def bfs_shortest_path(graph, start, end):


queue = deque([(start, [start])])


visited = set()


while queue:


current_node, path = queue.popleft()


if current_node == end:


return path


if current_node not in visited:


visited.add(current_node)


for neighbor in graph[current_node]:


if neighbor not in visited:


queue.append((neighbor, path + [neighbor]))


return None

示例图


graph = {


'A': ['B', 'C'],


'B': ['A', 'D', 'E'],


'C': ['A', 'F'],


'D': ['B'],


'E': ['B', 'F'],


'F': ['C', 'E']


}

查找从A到F的最短路径


path = bfs_shortest_path(graph, 'A', 'F')


print("Shortest path from A to F:", path)


LeetCode图最短路径问题实例

LeetCode上有许多关于图最短路径的问题,以下是一些常见的例子:

1. LeetCode 127. Word Ladder:给定两个单词,找出从第一个单词到第二个单词的最短转换序列,其中每个转换只能改变一个字母,并且每个单词在转换序列中只能使用一次。

2. LeetCode 126. Word Ladder II:与问题127类似,但需要找到所有可能的最短转换序列。

3. LeetCode 752. Open the Lock:给定一个密码锁,找出从初始密码到目标密码的最短旋转次数。

4. LeetCode 743. Network Delay Time:给定一个网络图和查询,计算从源节点到所有其他节点的最短传输时间。

总结

本文介绍了队列广度优先搜索(BFS)在图最短路径问题中的应用。通过使用队列和前驱节点字典,我们可以有效地找到两个节点之间的最短路径。LeetCode上有许多关于图最短路径的问题,通过练习这些题目,可以加深对BFS算法的理解和应用。