p.s.自用
题目描述
给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子
输入
第一行:n(结点数<=100),m(边数<=200)。
以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。
输出
第一行:树根:root。
第二行:孩子最多的结点max。
第三行:max的孩子。
样例输入 Copy
8 7 4 1 4 2 1 3 1 5 2 6 2 7 2 8
样例输出 Copy
4 2 6 7 8
易错
因采用数组存树,要注意在之后的求孩子代码中排除root的存在
答案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int tree[1005] = { 0 };
int max[1005] = { 0 };//计数:孩子数
int main()
{
int n, m, xi, yi;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)//初始化树
tree[i] = i;
for (int i = 0; i < m; i++)//存边
{
scanf("%d%d", &xi, &yi);
tree[yi] = xi;//存父
max[xi]++;//xi是父亲
}
int root = 1;
while (tree[root] != root)
root = tree[root];
int MAX = -1;
int numMax = -1;
for (int i = 1; i <= n; i++)
{
if (max[i] > MAX)
{
MAX = max[i];
numMax = i;
}
}
printf("%d\n%d\n", root, numMax);
for (int i = 1; i <= n; i++)
if (tree[i] == numMax && tree[i] != i)
printf("%d ", i);
}