#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<int>> g;
vector<int> cost;
vector<int> h;
vector<pair<int, int>> dp;
int dfs2(int u, int x) {
int ans = 1e18;
if (h[u] >= x) { //can keep root
ans = dp[u].first;
}
int tmp = cost[u];
for (int v : g[u]) {
tmp += dfs2(v, x);
}
ans = min(ans, tmp);
//~ cout << "OTHER: " << u << " "<< x << " " << ans << endl;
return ans;
}
void dfs(int u) {
dp[u].second += cost[u];
for (int v : g[u]) {
dfs(v);
dp[u].second += min(dp[v].first, dp[v].second);
dp[u].first += dfs2(v, h[u]);
}
//~ cout << u << ": " << dp[u].first << " " << dp[u].second << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
g = vector<vector<int>> (n);
dp = vector<pair<int, int>> (n, {0, 0});
cost = vector<int> (n);
h = vector<int> (n);
for (int i = 0; i < n; i++) {
int a;
cin >> a >> h[i] >> cost[i];
a--;
if (a != i) g[a].push_back(i);
}
dfs(0);
int ans = min(dp[0].first, dp[0].second);
cout << ans << endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |