PTA-L2-026 小字辈 (25分)
这道题就是dfs.
就是问树的高度
我们把祖先给标记出来。
然后从祖先开始dfs.
同时在dfs中更新数的高度。
同时记录当前操作的最底结点。
一旦发现有更深的,我们需要清空。在进行存储。
用set来存储。可以查重,因为我们可能dfs到同一个结点上面去。
最后输出即可。
(因为我们输入的时候就是按照递增顺序来的,所以不需要sort了)
代码部分:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e5 + 10;
const int M = 55;
const int INF = 1e6 + 10;
const double eps = 0.05;
typedef long long ll;
int n;
vector<int> v[N];
set<int> s;
int sum;
void dfs(int x, int cnt)
{
if (cnt > sum)
{
sum = cnt;
s.clear();
s.insert(x);
}
else if (cnt == sum)
{
s.insert(x);
}
int siz = v[x].size();
for (int i = 0; i < siz; i++)
{
dfs(v[x][i], cnt + 1);
}
}
int main()
{
int root;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
scanf ("%d", &x);
if (x == -1)
{
root = i;
continue;
}
v[x].push_back(i);
}
dfs(root, 1);
cout << sum << endl;
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++)
{
if (it != s.begin())
{
cout << " ";
}
cout << *it;
}
return 0;
}