【题目描述】
给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子。
【输入】
第一行:n(结点个数≤100),m(边数≤200)。
以下m行:每行两个结点x和y,表示y是x的孩子(x,y≤1000)。
【输出】
第一行:树根:root;
第二行:孩子最多的结点max;
第三行:max的孩子(按编号由小到输出)。
【输入样例】
8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8
【输出样例】
4
2
6 7 8
#include
using namespace std;
const int N = 105;
int n, m, root, maxNode;
int par[N];
int main() {
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
par[b] = a;
}
for (int i = 1; i <= n; ++i) {
//双亲为0的结点为根节点
if (par[i] == 0)
root = i;
}
cout << root << endl;
//找孩子最多的结点maxNode
int maxCnt = 0;//maxNode的孩子个数
for (int i = 1; i <= n; ++i) {
int cnt = 0;//查找有多少个结点的双亲为i
for (int j = 1; j <= n; ++j) {
if (par[j] == i)
cnt++;
}
if (cnt > maxCnt) {
maxNode = i;
maxCnt = cnt;
}
}
cout << maxNode << endl;
for (int i = 1; i <= n; ++i) {
if (par[i] == maxNode)
cout << i << " ";
}
return 0;
}
使用一个deg数组,预处理下,来优化解法一,找一个结点有几个孩子,就可以采用用一个数组记录出度数即可;
#include
using namespace std;
const int N = 105;
int n, m, root, maxNode;
int par[N], deg[N];
int main() {
cin.tie(0);
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
par[b] = a;
}
for (int i = 1; i <= n; ++i) {
//双亲为0的结点为根节点
if (par[i] == 0)
root = i;
//预处理,设置双亲结点par[i]的出度
deg[par[i]]++;
}
cout << root << endl;
//找孩子最多的结点maxNode
int maxDeg = 0;
for (int i = 1; i <= n; ++i) {
if (deg[i] > maxDeg) {
maxDeg = deg[i];
maxNode = i;
}
}
cout << maxNode << endl;
for (int i = 1; i <= n; ++i) {
if (par[i] == maxNode)
cout << i << " ";
}
return 0;
}