设 所有点的深度和为sum, 最后访问的d
我们假设需要返回外卖站,那么从源点到所有需要到达点的距离等于 2 * sum
, 那么不需要返回那, 那么 这个路径可以表示为,
2 * sum - d
, 因为最后访问的不需要返回,其他需要返回的,在该路径上加一个到达该路径上的回路就ok了。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, sum, mx;
int p[N], d[N];
int dfs(int u) {
if (p[u] == -1 || d[u] > 0) return d[u];
sum ++;
d[u] = dfs(p[u]) + 1;
return d[u];
}
int main() {
int t;
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
cin >> p[i];
}
while (m --) {
cin >> t;
mx = max(mx, dfs(t));
cout << sum * 2 - mx << endl;
}
}