bfs(广度优先遍历)
可以看到从一点出发,依次遍历它的邻接节点
bfs图解过程
可以看到通过队列先进先出的特性,可以完成无向图的bfs
实现代码
# 用一个字典来表示无向图,节点为key,邻接点组成的list为value
graph = {
'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D', 'E'],
'D': ['B', 'C', 'E', 'F'],
'E': ['C', 'D'],
'F': ['D']
}
def bfs(graph: dict, start_point):
"""
:param graph: 传进来的图
:param start_point: 起始节点
:return:
"""
queue = []
queue.append(start_point)
# 储存已经访问过的节点
seen = set()
seen.add(start_point)
while len(queue) > 0:
point = queue.pop(0)
nodes = graph[point]
for node in nodes:
# 如果这个节点没有被访问过
if node not in seen:
queue.append(node)
seen.add(node)
print(point)
利用bfs寻找最短路径
# 用一个字典来表示无向图,节点为key,邻接点组成的list为value
graph = {
'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D', 'E'],
'D': ['B', 'C', 'E', 'F'],
'E': ['C', 'D'],
'F': ['D']
}
def find_shortest_path(graph: dict, start_point):
"""
:param graph: 传进来的图
:param start_point: 起始节点
:return:
"""
queue = []
queue.append(start_point)
# 储存已经访问过的节点
seen = set()
seen.add(start_point)
# 存储上一个节点
parent = {start_point: None}
while len(queue) > 0:
point = queue.pop(0)
nodes = graph[point]
for node in nodes:
# 如果这个节点没有被访问过
if node not in seen:
queue.append(node)
seen.add(node)
parent[node] = point
# print(point)
return parent
if __name__ == '__main__':
parent_dict = find_shortest_path(graph, "A")
end = "E"
while end != None:
print(end, end='<-')
end = parent_dict[end]
通过记录每个节点的父节点,倒推即可得到上一个节点即可得到图的最短路径
dfs(深度优先遍历)
从一个节点一路走到黑
dfs图解
利用栈先进后出的特性,完成对图的深度优先遍历
实现代码
graph = {
'A': ['B', 'C'],
'B': ['A', 'C', 'D'],
'C': ['A', 'B', 'D', 'E'],
'D': ['B', 'C', 'E', 'F'],
'E': ['C', 'D'],
'F': ['D']
}
def dfs(graph: dict, start_point):
"""
:param graph: 传进来的图
:param start_point: 起始节点
:return:
"""
stack = []
stack.append(start_point)
# 储存已经访问过的节点
seen = set()
seen.add(start_point)
while len(stack) > 0:
point = stack.pop()
nodes = graph[point]
for node in nodes:
# 如果这个节点没有被访问过
if node not in seen:
stack.append(node)
seen.add(node)
print(point)