团体程序设计天梯赛
L2-043 龙龙送外卖
假设走完所有点回到原点,那么走过的距离
就是所有走过的边数 * 2
,因为我们可以不用回到原点,所以 res = sum * 2 - d
(所有点餐地中到原点的最大距离)。
d[N]
不仅用来记录节点深度,也用来标记节点是否被加入过路径。
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 100010;
int fa[N], d[N];
int sum, mx;
int dfs(int u){
if(fa[u] == -1 || d[u]) return d[u];
sum ++;
d[u] = 1 + dfs(fa[u]);
return d[u];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> fa[i];
for(int i = 1; i <= m; i ++){
int x;
cin >> x;
mx = max(mx, dfs(x));
cout << 2 * sum - mx << '\n';
}
return 0;
}