link
应该知道这道题求得是树的深度,同时记录深度最大时的孩子。用深搜即可。
//输入在第一行给出家族人口总数 N(不超过 100 000 的正整数)
//我们把家族成员从 1 到 N 编号。
//随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父 / 母。
//家谱中辈分最高的老祖宗对应的父/母编号为 -1。
//9
//2 6 5 5 -1 5 6 4 7
//首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。
//然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
//4----最深层数
//1 9-------在最深层数的叶子节点编号---递增
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 100010;
int n,root;//祖宗
vector<int>G[N];
int max_d = 0;
vector<int> m_id;
void dfs(int v,int d) {
if (G[v].size() == 0) {
if (d > max_d) {
m_id.clear();
max_d = d;
m_id.push_back(v);
}else if(d==max_d)
m_id.push_back(v);
return;
}
for (int i = 0; i < G[v].size(); i++) {
dfs(G[v][i],d+1);
}
}
int main() {
cin >> n;
for (int i = 1; i <=n; i++) {
int pre;
cin >> pre;//2 6 5 5 -1 5 6 4 7
if (pre != -1)
G[pre].push_back(i);//存每个孩子的节点
else
root = i;//祖宗
}
dfs(root,1);
cout <<max_d<<endl;
sort(m_id.begin(), m_id.end());
for (int i = 0; i < m_id.size(); i++) {
if (i == 0)cout << m_id[i];
else cout << " " << m_id[i];
}
return 0;
}