有向图和无向图。
把图变成代码,可以使用邻接矩阵。
BFS:breadth first search ,广度优先搜索
DFS:depdth first search, 深度优先搜索
"""构造图"""
from collections import deque
GRAPH = {
"A": ["B", "F"],
"B": ["C", "I", "G"],
"C": ["B", "I", "D"],
"D": ["C", "I", "G", "H", "E"],
"E": ["D", "H", "F"],
"F": ["A", "G", "E"],
"G": ["B", "F", "H", "D"],
"H": ["G", "D", "E"],
"I": ["B", "C", "D"],
}
class Queue(object):
def __init__(self):
self._deque = deque()
def push(self, value):
return self._deque.append(value)
def pop(self):
return self._deque.popleft()
def __len__(self):
return len(self._deque)
# 广度优先搜索
def bfs(graph, start):
search_queue = Queue()
search_queue.push(start)
searched = set() # 访问过的节点
while search_queue:
cur_node = search_queue.pop()
if cur_node not in searched: # 没有被访问过的节点
print(cur_node)
# yield cur_node
searched.add(cur_node)
for node in graph[cur_node]:
search_queue.push(node)
print("bfs:")
bfs(GRAPH, "A")
输出结果:
bfs:
A
B
F
C
I
G
E
D
H
ABFCIGEDH从近到远的输出
# 深度优先
DFS_SEARCHED = set()
def dfs(graph, start):
if start not in DFS_SEARCHED:
print(start)
DFS_SEARCHED.add(start)
for node in graph[start]:
if node not in DFS_SEARCHED:
dfs(graph, node)
print("dfs:")
dfs(GRAPH, "A")
结果:
dfs:
A
B
C
I
D
G
F
E
H