dfs遍历树,找出树的深度最大的节点。
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
vector<int> g[N];
int d[N], f[N];
bool st[N];
void dfs(int u)
{
for(int j=0;j<g[u].size();j++)
{
d[g[u][j]] = d[u] + 1;
dfs(g[u][j]);
}
}
int main()
{
int n, m;
cin >> n >> m;
int ro;
for(int i=1;i<=n;i++)
{
cin >> f[i];
if(f[i] == -1) ro = i;
else g[f[i]].push_back(i);
}
dfs(ro);
int v = 0;
int maxn = 0;
for(int i=1;i<=m;i++)
{
int x;
cin >> x;
maxn = max(maxn, d[x]);
while(!st[x]&&x!=ro)
{
st[x] = 1;
v += 2;
x = f[x];
}
cout << v - maxn << endl;
}
return 0;
}