在BFS、迭代DFS和递归DFS中,我们必须标记已访问的节点。这是因为在遍历图时,我们可能会遍历到同一节点多次。为了避免在这种情况下会产生错误的结果,我们必须标记已经访问的节点。然而,在何时标记节点为访问过的上面,三种算法有所不同。
在BFS中,我们将节点入队时立即标记为已访问,因为出队的节点已经被完全访问。我们可以使用一个布尔型数组visited[]来记录节点是否已被访问。下面是BFS的示例代码:
from collections import deque
def bfs(start, adj_list):
visited = [False] * len(adj_list)
queue = deque([start])
visited[start] = True
while queue:
curr_node = queue.popleft()
print(curr_node, end=' ')
for neighbor in adj_list[curr_node]:
if not visited[neighbor]:
queue.append(neighbor)
visited[neighbor] = True
在迭代DFS中,我们需要在发现新节点时标记它为已访问。这是因为我们将节点压入堆栈时,并没有完全遍历它。我们同样可以使用一个布尔型数组visited[]来记录节点是否已被访问。下面是迭代DFS的示例代码:
def iterative_dfs(start, adj_list):
visited = [False] * len(adj_list)
stack = [start]
visited[start] = True
while stack:
curr_node = stack.pop()
print(curr_node, end=' ')
for neighbor in adj_list[curr_node]:
if not visited[neighbor]:
stack.append(neighbor)
visited[neighbor] = True
在递归DFS中,我们需要在调用递归函数
上一篇:BFS最短路径引理22.3
下一篇:BFS(广度优先搜索)- 树遍历