龙龙送外卖不知道送了多少遍。。
今天又送一遍,感觉比以前好多了
思路就是要走的总距离 - 最长路径。
算总距离直接每次dfs往他父亲走就行了,如果这个点没有被访问过,那么显然要把距离给加上去;如果已经访问过了,因为每次只走父亲结点,再访问的结点也都是访问过的,直接return
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
constexpr int N = 1e5 + 100;
int a[N], d[N];
int mxdis;
int dfs(int x, int dis) {
mxdis = max(mxdis, dis + d[x]);
if (a[x] == -1 || d[x]) {
return dis << 1;
}
int res = dfs(a[x], dis + 1);
d[x] = d[a[x]] + 1;
return res;
}
void solve() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int ans = 0;
while (m--) {
int x;
cin >> x;
int dis = dfs(x, 0);
ans += dis;
cout << (ans - mxdis) << "\n";
}
}
int32_t main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int tt(1);
//cin >> tt;
while (tt--) {
solve();
}
return 0;
}