#include<bits/stdc++.h>
#define N 305
using namespace std;
int n,m;
vector<int> G[N];
int w[N];
int dp[N][N];//dp[i][j] : 从i往下选j门课得到的最大学分
void dfs(int u,int d){//选到第u门课,还剩d门课可以选
if(d==0)return;
for(int i=0;i<G[u].size();i++){
int t=G[u][i];
for(int j=0;j<d;j++){
dp[t][j]=dp[u][j]+w[t];
}
dfs(t,d-1);
for(int j=1;j<=d;j++){
dp[u][j]=max(dp[u][j],dp[t][j-1]);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int k;
cin>>k>>w[i];
G[k].push_back(i);
}
dfs(0,m);
cout<<dp[0][m]<<endl;
return 0;
}
发表评论