用邻接表作为图的存储结构建立一个图,并对此图分别进行深度优先搜索和广度优先搜索遍历
时间: 2024-02-09 16:08:12 浏览: 78
好的,我来回答你的问题。
首先,我们需要了解什么是邻接表。邻接表是一种图的存储结构,它将每个顶点的所有邻居顶点存储在一个链表中。邻接表通常用于存储稀疏图,因为它不会浪费太多空间。
现在,让我们来建立一个图并用邻接表来存储它。假设我们有以下这个图:
```
0 -- 1
|\ |
| \ |
3 -- 2
```
我们可以将它表示为一个邻接表,如下所示:
```
0: 1 -> 3
1: 0 -> 2
2: 1 -> 3
3: 0 -> 2
```
现在,让我们来分别对这个图进行深度优先搜索和广度优先搜索。
深度优先搜索(DFS)是一种遍历图的算法,它从一个顶点开始,沿着一条路径一直走到底,然后返回并探索其他路径。DFS通常使用递归或栈来实现。
下面是使用 DFS 遍历上面那个图的算法:
```
// visited数组记录每个节点是否被访问过
// adj是邻接表,v是当前节点
void dfs(int v, vector<bool>& visited, vector<vector<int>>& adj) {
// 标记当前节点为已访问
visited[v] = true;
cout << v << " ";
// 遍历当前节点的邻居节点
for (int w : adj[v]) {
// 如果该邻居节点没有被访问过,则递归访问它
if (!visited[w]) {
dfs(w, visited, adj);
}
}
}
// 对整个图进行DFS遍历
void dfsTraversal(vector<vector<int>>& adj) {
int n = adj.size();
vector<bool> visited(n, false);
// 从每个未被访问的节点开始遍历
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs(i, visited, adj);
}
}
}
```
使用上面的算法,对于上面的图,DFS会按照以下顺序遍历节点:0 -> 1 -> 2 -> 3。
广度优先搜索(BFS)是另一种遍历图的算法,它从一个顶点开始,先访问所有与该顶点相邻的顶点,然后再访问与这些顶点相邻的顶点,以此类推。BFS通常使用队列来实现。
下面是使用 BFS 遍历上面那个图的算法:
```
// visited数组记录每个节点是否被访问过
// adj是邻接表,start是起点
void bfs(int start, vector<bool>& visited, vector<vector<int>>& adj) {
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
// 取出队头节点
int v = q.front();
q.pop();
cout << v << " ";
// 遍历该节点的所有邻居节点
for (int w : adj[v]) {
// 如果该邻居节点没有被访问过,则加入队列并标记为已访问
if (!visited[w]) {
q.push(w);
visited[w] = true;
}
}
}
}
// 对整个图进行BFS遍历
void bfsTraversal(vector<vector<int>>& adj) {
int n = adj.size();
vector<bool> visited(n, false);
// 从每个未被访问的节点开始遍历
for (int i = 0; i < n; i++) {
if (!visited[i]) {
bfs(i, visited, adj);
}
}
}
```
使用上面的算法,对于上面的图,BFS会按照以下顺序遍历节点:0 -> 1 -> 3 -> 2。
阅读全文