用c++写出代码,把图的深度优先遍历、广度优先遍历改为输出深度优先生成树、广度优先生成树
时间: 2023-06-21 15:05:47 浏览: 96
C++无向图深度优先和广度优先遍历(编译可运行).rar
5星 · 资源好评率100%
以下是使用邻接表表示图的深度优先生成树和广度优先生成树的C++代码:
```
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int N = 100005;
vector<int> adj[N]; // 邻接表
// 深度优先生成树
void dfs(int u, vector<bool>& visited, vector<int>& parent) {
visited[u] = true;
for (int v : adj[u]) {
if (!visited[v]) {
parent[v] = u;
dfs(v, visited, parent);
}
}
}
// 广度优先生成树
void bfs(int u, vector<bool>& visited, vector<int>& parent) {
queue<int> q;
visited[u] = true;
q.push(u);
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int v : adj[cur]) {
if (!visited[v]) {
visited[v] = true;
parent[v] = cur;
q.push(v);
}
}
}
}
int main() {
int n, m; // n:结点数,m:边数
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u); // 因为是无向图,所以要加两条边
}
// 深度优先生成树
vector<bool> visited(n + 1, false);
vector<int> parent(n + 1, 0);
dfs(1, visited, parent);
cout << "深度优先生成树:" << endl;
for (int i = 2; i <= n; i++) {
cout << i << " -> " << parent[i] << endl;
}
// 广度优先生成树
visited.assign(n + 1, false);
parent.assign(n + 1, 0);
bfs(1, visited, parent);
cout << "广度优先生成树:" << endl;
for (int i = 2; i <= n; i++) {
cout << i << " -> " << parent[i] << endl;
}
return 0;
}
```
注意:在无向图中,深度优先生成树和广度优先生成树的起点是任意的,这里以结点1作为起点进行遍历。
阅读全文