图的dfs和bfs遍历实现
时间: 2023-06-11 12:07:56 浏览: 122
图的深度优先搜索(DFS)和广度优先搜索(BFS)是两种常见的图遍历算法。
假设我们有一个无向图,其中边用边列表表示如下:
```
edges = [(0, 1), (0, 2), (1, 2), (2, 0), (2, 3), (3, 3)]
```
其中每个元素表示一条边,例如 `(0, 1)` 表示节点 `0` 和节点 `1` 之间有一条边。
### DFS
DFS 通过递归地访问每个节点及其邻居来遍历图。具体实现如下:
```python
# 图的深度优先搜索
def dfs(graph, start):
# visited 用于记录已经访问的节点
visited = set()
# 进行递归访问
def traverse(node):
visited.add(node)
print(node, end=' ')
for neighbor in graph[node]:
if neighbor not in visited:
traverse(neighbor)
traverse(start)
```
在上面的代码中,我们首先定义了一个 `visited` 集合,用于记录已经访问的节点。然后我们定义了一个内部函数 `traverse(node)`,它会递归访问每个节点及其邻居。在递归访问每个节点时,我们首先将其添加到 `visited` 集合中,然后打印出节点的值,并递归访问其未被访问过的邻居。
我们可以使用以下代码调用 `dfs` 函数,以从节点 `2` 开始遍历图:
```python
# 测试 DFS
graph = {0: [1, 2], 1: [2], 2: [0, 3], 3: [3]}
dfs(graph, 2)
```
输出如下:
```
2 0 1 3
```
### BFS
BFS 通过先访问起点节点,然后逐层访问其邻居节点来遍历图。具体实现如下:
```python
# 图的广度优先搜索
def bfs(graph, start):
# visited 用于记录已经访问的节点
visited = set()
# 使用队列进行遍历
queue = [start]
visited.add(start)
while queue:
node = queue.pop(0)
print(node, end=' ')
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
```
在上面的代码中,我们首先定义了一个 `visited` 集合和一个队列 `queue`,用于记录已经访问的节点和待访问的节点。然后我们将起点节点添加到队列中,并将其标记为已访问。在接下来的循环中,我们不断从队列中取出一个节点,并打印出其值,然后逐个访问其未被访问过的邻居节点,并将其添加到队列中,同时将其标记为已访问。
我们可以使用以下代码调用 `bfs` 函数,以从节点 `2` 开始遍历图:
```python
# 测试 BFS
graph = {0: [1, 2], 1: [2], 2: [0, 3], 3: [3]}
bfs(graph, 2)
```
输出如下:
```
2 0 3 1
```
阅读全文