用邻接表作为图的存储结构建立一个图,并对此图分别进行深度优先搜索和广度优先搜索遍历。
时间: 2024-02-15 11:01:23 浏览: 123
好的,我可以给您讲解一下如何用邻接表作为图的存储结构,并对图进行深度优先搜索和广度优先搜索的遍历。
邻接表是一种常用的图的存储结构,它通过一个数组和链表来表示图中的各个节点和边。具体来说,数组中的每个元素对应图中的一个节点,而该元素的值是一个链表,链表中存储了该节点所连接的其他节点。下面是一个用邻接表表示的无向图的示例:
```python
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
```
在这个邻接表中,字母表示节点,字母对应的列表表示与该节点相连的其他节点。例如,节点 A 与节点 B 和节点 C 相连。
现在,我们来分别用深度优先搜索和广度优先搜索遍历这个图。
### 深度优先搜索
深度优先搜索(Depth First Search,DFS)是一种用于遍历或搜索树或图的算法。它从一个根节点开始,沿着一条路径一直走到底,然后返回到上一个节点,在继续搜索下一条路径。具体来说,深度优先搜索的过程如下:
1. 从起始节点开始遍历。
2. 如果当前节点未被访问过,将其标记为已访问。
3. 对当前节点的所有未访问过的邻居节点进行深度优先搜索。
4. 重复步骤 3,直到当前节点的所有邻居节点都已被访问过。
5. 回溯到上一个节点,重复步骤 3 和 4,直到所有节点都被访问过。
下面是用 Python 实现深度优先搜索的代码:
```python
def dfs(graph, start):
visited = set() # 用集合记录已经访问过的节点
stack = [start] # 用栈来存储要访问的节点
while stack:
vertex = stack.pop() # 取出栈顶节点
if vertex not in visited:
visited.add(vertex) # 标记为已访问
stack.extend(graph[vertex] - visited) # 将未访问过的邻居节点入栈
return visited
```
其中,`graph` 是一个邻接表表示的图,`start` 是起始节点。这个函数返回的是一个集合,表示遍历过的节点。
我们可以用上面那个示例图来测试一下这个函数:
```python
>>> dfs(graph, 'A')
{'E', 'D', 'F', 'A', 'C', 'B'}
```
从节点 A 开始,深度优先搜索遍历了整个图,返回的集合中包含了所有的节点。
### 广度优先搜索
广度优先搜索(Breadth First Search,BFS)是一种用于遍历或搜索树或图的算法。它从一个根节点开始,先访问当前节点的所有邻居节点,然后按照宽度优先的顺序遍历下一层节点。具体来说,广度优先搜索的过程如下:
1. 从起始节点开始遍历。
2. 如果当前节点未被访问过,将其标记为已访问,并将其加入队列。
3. 从队列中取出一个节点。
4. 对这个节点的所有未访问过的邻居节点进行访问,并将它们加入队列。
5. 重复步骤 3 和 4,直到队列为空。
下面是用 Python 实现广度优先搜索的代码:
```python
from collections import deque
def bfs(graph, start):
visited = set() # 用集合记录已经访问过的节点
queue = deque([start]) # 用队列来存储要访问的节点
while queue:
vertex = queue.popleft() # 取出队首节点
if vertex not in visited:
visited.add(vertex) # 标记为已访问
queue.extend(graph[vertex] - visited) # 将未访问过的邻居节点入队
return visited
```
其中,`deque` 是 Python 内置的双端队列类型,它提供了 O(1) 时间复杂度的队首和队尾操作。`graph` 和 `start` 的含义与上面相同。
我们可以用上面那个示例图来测试一下这个函数:
```python
>>> bfs(graph, 'A')
{'B', 'C', 'A', 'E', 'F', 'D'}
```
从节点 A 开始,广度优先搜索遍历了整个图,返回的集合中包含了所有的节点。
阅读全文