7-11 小字辈 (25 分)(递归,树)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
9
2 6 5 5 -1 5 6 4 7
输出样例:
4
1 9
思路(递归)
AC代码
#include <iostream>
using namespace std;
int perparent[100001];
int per[100001] = { 0 };
int Generation(int num)
{
if (per[num])//已知辈分
return per[num];
else//不知辈分
{
if (perparent[num] == -1)//是老祖宗
return per[num] = 1;
else//不是老祖宗
return per[num] = Generation(perparent[num]) + 1;
}
}
int main()
{
int i, N, max;
cin >> N;
for (i = 1; i <= N; i++)
cin >> perparent[i];
max = 0;
for (i = 1; i <= N; i++)
{
per[i] = Generation(i);
if (per[i] > max)
max = per[i];
}
cout << max << endl;
int flag=1;
for (i = 1; i <= N; i++)
{
if (per[i] == max&&flag)
{
cout << i;
flag=0;
}
else if(per[i]==max)
cout << " "<<i;
}
}
//函数部分的另一种写法(没什么区别o( ̄┰ ̄*)ゞ)
int Generation(int num)
{
if (per[num])
return per[num];
else
{
int count;
if (perparent[num] == -1)
count = 1;
else
count = Generation(perparent[num]) + 1;
per[num] = count;
return count;
}
}