#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define endl '\n'
#define int long long
const int N=2e5+5,inf=2e17,MOD=1e9+7;
vector<int> ch[N];
int w[N],leafs[N],dp[N][505],m;
void dfs(int node){
// cout<<node<<' '<<leafs[node]<<endl;
for(auto i:ch[node]){
dfs(i);
for(int j=min(m,leafs[node]);j>=0;j--){
for(int k=0;k<=min(m,leafs[i]) && j+k<=min(m,leafs[node]);k++){
//if(node==2 && j+k==2 && dp[node][j]+dp[i][k]==300)cout<<j<<' '<<k<<' '<<dp[node][j]<<' '<<dp[i][k]<<' '<<i<<endl;
dp[node][j+k]=max(dp[node][j+k],dp[node][j]+dp[i][k]);
}
}
}
dp[node][1]=max(dp[node][1],w[node]);
// cout<<dp[node][1]<<' '<<dp[node][2]<<' '<<node<<endl;
}
void cnt(int node){
for(auto i:ch[node]){
cnt(i);
leafs[node]+=leafs[i];
}
if(ch[node].size()==0)leafs[node]+=1;
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
for(int i=0;i<N;i++){
for(int j=1;j<505;j++)dp[i][j]=-inf;
}
int n; cin>>n>>m;
int root;
for(int i=1;i<=n;i++){
int p,x; cin>>p>>x;
if(p==0)root=i;
w[i]=x;
ch[p].pb(i);
}
cnt(root);
dfs(root);
cout<<dp[root][m];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |