https://pintia.cn/problem-sets/1259041418971803648/problems/1259047109883162624
(题目链接如上)
题意:
给定一个庞大家族的家谱,要请你给出最小一辈的名单。
题解:
结点设计:
struct tnode{
int parent;
int num;
int level;//记录辈分,即在树的第几层
}node[100005];
思路:对每个结点,深搜直到它的祖先根节点返回,回溯的时候每一层的层数等于上一层的层数加一。如果搜到某个结点的level不为0,也直接返回,回溯时从这个结点的层数往下加。
AC代码:
#include <iostream>
using namespace std;
int n,lev;
struct tnode{
int parent;
int num;
int level;
}node[100005];
void dfs(int now){
if(node[now].parent==-1){
node[now].level=1;
return;
}
if(node[now].level!=0){
return;
}
int next=node[now].parent;
dfs(next);
node[now].level=node[next].level+1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>node[i].parent;
node[i].num=i;
}
int maxlev=-1;
for(int i=1;i<=n;i++){
dfs(i);
lev=node[i].level;
maxlev=max(maxlev,lev);
}
int flag=0;
cout<<maxlev<<endl;
for(int i=1;i<=n;i++){
if(node[i].level==maxlev){
if(!flag){
cout<<i; flag=1;
}
else cout<<" "<<i;
}
}
cout<<endl;
return 0;
}