编写源程序,把图的深度优先遍历、广度优先遍历改为输出深度优先生成树、广度优先生成树,用C++编写
时间: 2023-06-21 15:10:00 浏览: 123
以下是用C++编写的深度优先生成树和广度优先生成树:
```c++
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 100;
vector<int> G[MAXN]; // 图的邻接表表示
bool vis[MAXN]; // 标记节点是否已访问
int parent[MAXN]; // 存储生成树中每个节点的父节点
// 深度优先生成树
void dfs_tree(int u, int p) {
parent[u] = p; // 将节点u的父节点设置为p
vis[u] = true; // 标记节点u已被访问
for(int i=0; i<G[u].size(); i++) {
int v = G[u][i];
if(!vis[v]) {
dfs_tree(v, u); // 递归访问节点v
}
}
}
// 广度优先生成树
void bfs_tree(int s) {
queue<int> Q;
memset(vis, false, sizeof(vis)); // 初始化标记数组
memset(parent, -1, sizeof(parent)); // 初始化父节点数组
Q.push(s); // 将起点s加入队列Q
vis[s] = true; // 标记起点s已被访问
while(!Q.empty()) {
int u = Q.front(); Q.pop();
for(int i=0; i<G[u].size(); i++) {
int v = G[u][i];
if(!vis[v]) {
parent[v] = u; // 将节点v的父节点设置为u
vis[v] = true; // 标记节点v已被访问
Q.push(v); // 将节点v加入队列Q
}
}
}
}
int main() {
int n, m;
cin >> n >> m; // 输入节点数n和边数m
for(int i=1; i<=m; i++) {
int u, v;
cin >> u >> v; // 输入边的起点和终点
G[u].push_back(v); // 添加一条从u到v的边
G[v].push_back(u); // 添加一条从v到u的边
}
// 深度优先生成树
memset(vis, false, sizeof(vis)); // 初始化标记数组
memset(parent, -1, sizeof(parent)); // 初始化父节点数组
dfs_tree(1, -1); // 从节点1开始进行深度优先遍历
cout << "深度优先生成树:" << endl;
for(int i=1; i<=n; i++) {
cout << parent[i] << " "; // 输出每个节点的父节点
}
cout << endl;
// 广度优先生成树
bfs_tree(1); // 从节点1开始进行广度优先遍历
cout << "广度优先生成树:" << endl;
for(int i=1; i<=n; i++) {
cout << parent[i] << " "; // 输出每个节点的父节点
}
cout << endl;
return 0;
}
```
该程序首先读入图的节点数n和边数m,然后根据输入的边构建图的邻接表表示。接下来,程序分别调用了dfs\_tree和bfs\_tree函数来生成深度优先生成树和广度优先生成树,并输出每个节点的父节点。
程序中使用了邻接表来表示图,vis数组用于标记每个节点是否已被访问,parent数组用于存储每个节点在生成树中的父节点。在dfs\_tree函数中,程序使用递归来实现深度优先遍历,并在访问每个节点时更新其父节点。在bfs\_tree函数中,程序使用队列来实现广度优先遍历,并在访问每个节点时更新其父节点。
注意,该程序假设图是连通的,如果图不连通,则需要对每个连通分量分别进行深度优先遍历或广度优先遍历。
阅读全文