用c++代码写出下题:给定一棵树,输出树的根 root,孩子最多的结点 max 以及他的孩子。 【输入形式】 第一行:n(结点数 0≤100),m(边数0≤200)。 以下 m 行;每行两个结点 x 和 y,表示 y 是 x 的孩子(x,y≤100)。 【输出形式】 第一行:树根:root。 第二行:孩子最多的结点 max。 第三行:max 的孩子。 【样例输入】 8 7 4 1 4 2 1 3 1 5 2 6 2 7 2 8 【样例输出】 4 2 6 7 8
时间: 2024-03-21 19:40:48 浏览: 101
以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 110;
vector<int> G[MAXN]; // 存储图
int n, m; // 结点数和边数
int root = 1; // 根结点
int max_node = 1; // 孩子最多的结点
int max_cnt = 0; // 最大孩子数
int dfs(int u, int fa) {
int cnt = 1; // 孩子结点数
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (v == fa) continue; // 避免重复搜索
cnt += dfs(v, u);
}
if (cnt > max_cnt) { // 更新最大孩子数
max_cnt = cnt;
max_node = u;
}
return cnt;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x); // 无向图需要双向加边
}
dfs(1, 0); // 从根结点开始搜索
cout << root << endl;
cout << max_node << endl;
for (int i = 0; i < G[max_node].size(); i++) { // 输出最大孩子的孩子结点
cout << G[max_node][i] << " ";
}
return 0;
}
```
代码解释:
首先读入结点数和边数,然后读入每条边,存储到邻接表中。接着从根结点开始进行深度优先搜索,统计每个结点的孩子结点数,并更新最大孩子数和对应的结点。最后输出根结点、孩子最多的结点和它的孩子结点即可。
注意:由于题目中没有给出根结点,所以默认根结点为 1,即从结点 1 开始搜索。
阅读全文