基本的 BFS 和 DFS,以及基于 BFS 的无权图最短路径算法

本文介绍了BFS(广度优先搜索)和DFS(深度优先搜索)的基本概念,这两种图算法均以Python实现,其中BFS利用队列,DFS利用栈。此外,文章还展示了如何扩展BFS来找到无权图中任意两点的最短路径,通过记录每个顶点的parent,可以逆向构造出最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS 基于队列实现,DFS 基于栈实现,是最基本的图算法,但是它们的扩展有很多实际用处。下面给出这两种图搜索的实现:

def bfs(graph, v):
	queue = [v]
	visited = set()
	visited.add(v)
	res = []
	while queue != []:
		temp = queue.pop(0)
		res.append(temp)
		for neighbor in graph[temp]:
			if neighbor not in visited:
				queue.append(neighbor)
				visited.add(neighbor)
	return res

def dfs(graph, v):
	stack = [v]
	visited = set()
	visited.add(v)
	res = []
	while stack != []:
		temp = stack.pop()
		res.append(temp)
		for neighbor in graph[temp]:
			if neighbor not in visited:
				stack.append(neighbor)
				visited.add(neighbor)
	return res

if __name__ == '__main__':
	g = {'A': ['B', 'C'],
		'B': ['A', 'C', 'D'],
		'C': ['A', 'D', 'E'],
		'D': ['B', 'C', 'E', 'F'],
		'E': ['C', 'D'],
		'F': ['D']}
	print(bfs(g, 'F'))
	print(dfs(g, 'F'))

这里使用了 Python 的 set 容器记录已经访问过的顶点。下面简单扩展一下 BFS,实现一个寻找无权图中任意两点最短路径的算法:

def shortestPath(graph, v, target):
	queue = [v]
	visited = set()
	visited.add(v)
	res = {}
	while queue != []:
		parent = queue.pop(0)
		for neighbor in graph[parent]:
			if neighbor not in visited:
				queue.append(neighbor)
				visited.add(neighbor)
				res[neighbor] = parent
	key = target
	path = [target]
	while key is not v:
		path.append(res[key])
		key = res[key]
	return path[::-1]

if __name__ == '__main__':
	g = {'A': ['B', 'C'],
		'B': ['A', 'C', 'D'],
		'C': ['A', 'D', 'E'],
		'D': ['B', 'C', 'E', 'F'],
		'E': ['C', 'D'],
		'F': ['D']}
	print(shortestPath(g, 'F', 'C'))

对于一个无权图来说,实际上从一点 BFS 到其他点的搜索路径就是这两点间的最短路径,只要使用一个映射(这里是一个字典)记录过程中每个顶点的 parent,最后逆向打印出来就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值