#include <bits/stdc++.h>
#define all(a) a.begin() , a.end()
using namespace std;
#define int long long
vector<int> graph[200005] , v(200005);
int n , m;
vector<int> dfs(int node , int par)
{
vector<int> dp = {0 , 0} , nedp(m + 5, 0);
for(auto i : graph[node])
{
if(i != par)
{
vector<int> curdp = dfs(i , node);
for(int i = 0 ; i < min((int)dp.size() , m + 1) ; i++)
{
for(int j = 0 ; j < min((int)curdp.size() , m + 1) ; j++)
{
if(i + j > m)
break;
nedp[i + j] = max(dp[i] + curdp[j] , nedp[i + j]);
}
}
dp = nedp;
for(int i = 0 ; i <= 1 + m ; i++)
nedp[i] = 0;
}
}
dp[1] = max(v[node] , dp[1]);
return dp;
}
void solve()
{
cin >> n >> m;
int ro = -1;
for(int i = 1 ; i <= n ; i++)
{
int a;
cin >> a >> v[i];
if(a == 0)
ro = i;
else
{
graph[a].push_back(i);
graph[i].push_back(a);
}
}
vector<int> f = dfs(ro , -1);
cout << f[m];
}
signed main()
{
// usaco("triangles");
int t = 1;
//cin >> t;
while(t--)
solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |