描述 一棵树有n个结点,已知树上所有的父子结点关系,请问该树的根是几号结点,哪个结点的子结点最多,该结点有哪些子结点。 输入描述 第一行,有1个整数n代表结点数量(0<n≤100) 接下来若干行;每行两个结点x和y,表示y是x的孩子(1≤x,y≤1000) 请注意:树上结点的编号不一定是连续的 输出描述 第一行输出树根的编号。 第二行输出孩子最多的结点编号(如果有多个结点的子结点都是最多的,则输出编号最大的那个)。 第三行输出第二行求出的孩子最多的结点,有哪些孩子,按照编号从小到大,输出这些孩子的编号,用空格隔开。使用C++实现
时间: 2024-03-24 11:38:47 浏览: 79
以下是使用C++实现的代码,注释中有详细的解释:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> parent(n + 1), childCount(n + 1), children[n + 1];
// 读入父子结点关系,统计每个结点的子节点数和子节点列表
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
parent[y] = x;
children[x].push_back(y);
childCount[x]++;
}
// 找到根节点
int root = 1;
while (parent[root] != 0) {
root = parent[root];
}
cout << root << endl;
// 找到子节点最多的结点
int maxChildCount = 0, maxChildNode = n;
for (int i = 1; i <= n; i++) {
if (childCount[i] > maxChildCount) {
maxChildCount = childCount[i];
maxChildNode = i;
} else if (childCount[i] == maxChildCount && i > maxChildNode) {
maxChildNode = i;
}
}
cout << maxChildNode << endl;
// 输出子节点列表
sort(children[maxChildNode].begin(), children[maxChildNode].end());
for (int i = 0; i < childCount[maxChildNode]; i++) {
cout << children[maxChildNode][i] << " ";
}
cout << endl;
return 0;
}
```
注意,为了方便起见,我们使用了vector和sort等STL容器和算法。如果不熟悉STL,可以使用数组和手写排序算法来实现。
阅读全文