思路:二叉苹果树模板题
代码:
#include<iostream>
#include<cstring>
#include <cmath>
#include<algorithm>
#include <vector>
using namespace std;
const int N=1010;
int n,m;
int idx,e[N],h[N],w[N],ne[N];
int f[N][N];
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dfs(int root)
{
for(int i=h[root];~i;i=ne[i])
{
dfs(e[i]);
for(int j=m;j>0;j--)
for(int k=0;k<j;k++)
f[root][j]=max(f[root][j],f[root][j-k-1]+f[e[i]][k]+w[i]);
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
add(a,i,b);
}
dfs(0);
cout<<f[0][m];
return 0;
}