题目名字
题意
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
思路
- 先找最老一辈
- 记录每一辈上下关系
- 输出最小一辈
坑点
:最后输出的不能有空格
算法:dfs
实现步骤
- 二维vector存孩子编号
- dfs寻找最小一代并记录过程中每个编号是第几代
- 找到最小代并输出
代码
using namespace std;
const int maxn=100010;
int n,a[maxn],x,root,ans,flag;
vector<int>v[maxn];//存储每个编号孩子
void DFS(int i,int cnt)
{
if(v[i].size()==0)
{
ans=max(ans,cnt);//寻找最小一代
return;
}
for(int j=0;j<v[i].size();j++)
{
int u=v[i][j];
a[u]=cnt+1;//存储每个编号的是第几代
DFS(u,cnt+1);//继续下一代
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
if(x>0) v[x].push_back(i);//存孩子
else root=i;//-1就是祖宗
}
a[root]=1;
DFS(root,1);//从祖宗开始递归
cout<<ans<<endl;//找到最小一代
for(int i=1;i<=n;i++)
{
if(a[i]==ans)
{
if(flag) cout<<" "<<i;
else
{cout<<i;flag=1;}//到最后一个人,不能打空格
}
}
return 0;
}