L2-043 龍龍送外賣

YuKiCheng發表於2024-03-28

考察的是貪心+記憶化搜尋。
最短路=走過的路徑*2-從根到小區最深路徑長度

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int p[maxn],dis[maxn],dp[maxn];
int maxdepth = 0, sumpath = 0;
int dfs(int s) {//記憶化搜尋
	if (p[s] == -1) return 0;
	if (dp[s]) return dp[s];
	sumpath++;
	dp[s] = dfs(p[s]) + 1;
	return dp[s];
}
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> p[i];
	}
	while (m--) {
		//最深
		int input;
		cin >> input;
		int depth = dfs(input);//到外賣地點的深度
		maxdepth = max(maxdepth, depth);
		cout << 2 * sumpath - maxdepth << '\n';
	}
	return 0;
}

相關文章