用邻接表作为图的存储结构,对此图进行分别深度优先和广度优先遍历并输出结果,用c++算法
时间: 2023-12-22 09:02:42 浏览: 86
C++无向图深度优先和广度优先遍历(编译可运行).rar
5星 · 资源好评率100%
以下是使用邻接表存储图,并分别进行深度优先和广度优先遍历的C++算法:
```cpp
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int MAXN = 100; // 最大顶点数
bool visited[MAXN]; // 标记是否访问过
vector<int> adjList[MAXN]; // 邻接表存储图
// 深度优先遍历
void dfs(int u) {
visited[u] = true; // 标记当前顶点已被访问
cout << u << " "; // 输出当前顶点
for (int i = 0; i < adjList[u].size(); i++) {
int v = adjList[u][i]; // v为u的邻接顶点
if (!visited[v]) { // 如果v未被访问过
dfs(v); // 递归访问v
}
}
}
// 广度优先遍历
void bfs(int s) {
queue<int> q;
visited[s] = true;
q.push(s);
while (!q.empty()) {
int u = q.front(); // 取出队首元素
q.pop();
cout << u << " "; // 输出当前顶点
for (int i = 0; i < adjList[u].size(); i++) {
int v = adjList[u][i]; // v为u的邻接顶点
if (!visited[v]) { // 如果v未被访问过
visited[v] = true; // 标记v已被访问
q.push(v); // 将v入队
}
}
}
}
int main() {
int n, m; // n为顶点数,m为边数
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adjList[u].push_back(v);
adjList[v].push_back(u); // 无向图需加上这行
}
// 深度优先遍历
memset(visited, false, sizeof(visited)); // 初始化visited数组
for (int i = 0; i < n; i++) {
if (!visited[i]) { // 如果i未被访问过
dfs(i); // 从i开始深度优先遍历
}
}
cout << endl;
// 广度优先遍历
memset(visited, false, sizeof(visited)); // 初始化visited数组
for (int i = 0; i < n; i++) {
if (!visited[i]) { // 如果i未被访问过
bfs(i); // 从i开始广度优先遍历
}
}
return 0;
}
```
其中,输入格式为:
```
顶点数 边数
边1起点 边1终点
边2起点 边2终点
...
```
例如,对于如下图:
```
0 -- 1 -- 3
| |
2 -- 4
```
输入为:
```
5 6
0 1
0 2
1 3
1 4
2 4
```
输出为:
```
0 1 3 4 2
0 1 2 3 4
```
阅读全文