天梯赛_L2-043 龙龙送外卖(推公式)

团体程序设计天梯赛

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;
}