用邻接表作为图的存储结构,对此图进行分别深度优先和广度优先遍历并输出结果,用c++算法。输出结果中要出现“请输入顶点个数和边的个数”“请输入顶点信息”“深度优先遍历的结果是”“广度优先遍历的结果是“”
时间: 2023-09-02 08:06:11 浏览: 67
C++无向图深度优先和广度优先遍历(编译可运行).rar
5星 · 资源好评率100%
好的,以下是用邻接表作为图的存储结构,对此图进行深度优先和广度优先遍历的C++算法:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Edge {
int v; // 边的另一个顶点
int weight; // 边的权重
Edge(int _v, int _w): v(_v), weight(_w) {}
};
vector<vector<Edge>> adj_list; // 邻接表表示的图
vector<bool> visited; // 记录顶点是否被访问过
// 深度优先遍历
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (auto &e : adj_list[u]) {
if (!visited[e.v]) {
dfs(e.v);
}
}
}
// 广度优先遍历
void bfs(int u) {
queue<int> q;
visited[u] = true;
q.push(u);
while (!q.empty()) {
int v = q.front();
q.pop();
cout << v << " ";
for (auto &e : adj_list[v]) {
if (!visited[e.v]) {
visited[e.v] = true;
q.push(e.v);
}
}
}
}
int main() {
int n, m;
cout << "请输入顶点个数和边的个数:";
cin >> n >> m;
// 初始化邻接表和visited数组
adj_list.resize(n);
visited.resize(n, false);
cout << "请输入顶点信息:" << endl;
for (int i = 0; i < n; i++) {
int info;
cin >> info;
// 这里可以将顶点信息存储下来,也可以不存储
}
cout << "请输入每条边的起点(从0开始)和终点,以及边的权重:" << endl;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj_list[u].push_back(Edge(v, w));
adj_list[v].push_back(Edge(u, w));
}
cout << "深度优先遍历的结果是:";
dfs(0);
cout << endl;
visited.clear();
visited.resize(n, false); // 重置visited数组
cout << "广度优先遍历的结果是:";
bfs(0);
cout << endl;
return 0;
}
```
代码解释:
1. `Edge` 结构体表示图中的一条边,包括另一个顶点和权重。
2. `adj_list` 是一个 vector 的 vector,表示邻接表存储的图。
3. `visited` 是一个 vector,记录每个顶点是否被访问过。
4. `dfs` 函数为深度优先遍历函数,使用递归实现。
5. `bfs` 函数为广度优先遍历函数,使用队列实现。
6. 在 `main` 函数中,先输入顶点个数和边的个数,然后根据输入的信息构建邻接表存储图。
7. 最后调用 `dfs` 和 `bfs` 函数进行遍历。
输出示例:
```
请输入顶点个数和边的个数:5 6
请输入顶点信息:
0
1
2
3
4
请输入每条边的起点(从0开始)和终点,以及边的权重:
0 1 1
0 2 2
1 3 3
1 4 4
2 4 5
3 4 6
深度优先遍历的结果是:0 1 3 4 2
广度优先遍历的结果是:0 1 2 3 4
```
阅读全文