无向连通图的广度遍历序列和深度遍历序列的输出。输入描述 顶点个数,边的条数,边的信息(每条边只输入一次)。 输出描述 从V0出发的广度遍历序列和深度遍历序列 的C++代码
时间: 2023-07-24 11:14:57 浏览: 79
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是一个简单的无向连通图的广度遍历和深度遍历的 C++ 代码实现,输入格式为:第一行为顶点个数和边的条数,接下来的每一行为一条边的信息,包括起点和终点。
广度遍历使用了队列(queue)数据结构,深度遍历使用了递归。
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;
void bfs(vector<vector<int>>& graph, int start, vector<int>& bfs_order) {
queue<int> q;
unordered_set<int> visited;
q.push(start);
visited.insert(start);
while (!q.empty()) {
int cur = q.front();
q.pop();
bfs_order.push_back(cur);
for (int neighbor : graph[cur]) {
if (visited.count(neighbor) == 0) {
q.push(neighbor);
visited.insert(neighbor);
}
}
}
}
void dfs(vector<vector<int>>& graph, int cur, vector<int>& dfs_order, unordered_set<int>& visited) {
visited.insert(cur);
dfs_order.push_back(cur);
for (int neighbor : graph[cur]) {
if (visited.count(neighbor) == 0) {
dfs(graph, neighbor, dfs_order, visited);
}
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> graph(n);
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
vector<int> bfs_order;
bfs(graph, 0, bfs_order);
vector<int> dfs_order;
unordered_set<int> visited;
dfs(graph, 0, dfs_order, visited);
cout << "BFS order: ";
for (int node : bfs_order) {
cout << node << " ";
}
cout << endl;
cout << "DFS order: ";
for (int node : dfs_order) {
cout << node << " ";
}
cout << endl;
return 0;
}
```
注意:这里默认起点为 V0,如果需要更改起点,只需将 `bfs(graph, 0, bfs_order)` 和 `dfs(graph, 0, dfs_order, visited)` 中的第二个参数改为其他节点即可。
阅读全文