题目链接
深搜过程中记录最小辈分和最小成员编号
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int n, maxn;
vector<int> a[100010];
vector<int> que;//记录最小成员编号
void dfs(int u, int k) {
if (k > maxn) {//如果当前辈分比之前的更小
maxn = k;//标记当前辈分位最小辈分
que.clear();//清空之前记录的最小成员编号
que.push_back(u);//压入新的最小成员编号
} else if (k == maxn)//如果与当前最小辈分相等
que.push_back(u);//压入最小成员编号
for (int i = 0; i < a[u].size(); i++) dfs(a[u][i], k + 1);//递归下一层
return;
}
int main(int argc, char const *argv[]) {
int flag;
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
if (x == -1)
flag = i;//记录老祖宗的编号
else
a[x].push_back(i);//建立关系图
}
dfs(flag, 1);//深搜
printf("%d\n", maxn);//输出最小辈分
sort(que.begin(), que.end());//递增顺序排序
for (int i = 0; i < que.size() - 1; i++) printf("%d ", que[i]);
printf("%d\n", que[que.size() - 1]);
return 0;
}