深搜DP
2026-08-20 15:43:01
发布于:广东
2阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5 + 5;
ll n;
vector<ll> g[N];
ll c[N];
ll dp[N];//以 u 为根的子树中,保证从 u 到该子树内所有叶子节点的路径上至少有一个黑色节点,所需的最小代价。
void dfs(ll u) {
// 如果是叶子
if (g[u].empty()) {
dp[u] = c[u];
return;
}
ll sum = 0;
for (auto v : g[u]) {
dfs(v);
sum += dp[v];
}
dp[u] = min(c[u], sum);//改自己好还是改自己的孩子好
}
int main() {
cin >> n;
for (ll i = 2; i <= n; i++) {
ll fa;
cin >> fa;
g[fa].push_back(i);
}
for (ll i = 1; i <= n; i++) {
cin >> c[i];
}
dfs(1);
cout << dp[1] << endl;
return 0;
}
这里空空如也


有帮助,赞一个