vector<int> adj[maxn]; int val[maxn]; ll f[maxn][maxn]; int n, m;
voiddfs( int u ){ f[u][1] = val[u]; for( int v : adj[u] ) { dfs( v ); for( int i = m + 1; i >= 1; -- i ) { for( int j = 1; j < i; ++ j ) { if( f[u][i-j] == -inf || f[v][j] == -inf ) continue; f[u][i] = max( f[u][i], f[u][i-j] + f[v][j] ); } } } }
voidsolve( ){ n = read( ), m = read( ); for( int i = 1; i <= n; ++ i ) { int k = read( ); val[i] = read( ); adj[k].push_back( i ); } for( int i = 0; i <= n; ++ i ) { for( int j = 0; j <= m + 1; ++ j ) { f[i][j] = -inf; } } dfs( 0 ); cout << f[0][m+1] << '\n'; }
structEdge { int v, w; }; vector<Edge> adj[maxn]; int val[maxn]; ll f[maxn][maxn]; int n, q;
voiddfs( int u, int p ){ int l = 0, r = 0; for( auto [v, w] : adj[u] ) { if( v == p ) continue; val[v] = w; if( l == 0 ) l = v; else r = v; dfs( v, u ); }
if( l == 0 && r == 0 ) { f[u][1] = val[u]; return; }
for( int j = 1; j <= n; ++ j ) { for( int k = 0; k <= j - 1; ++ k ) { f[u][j] = max( f[u][j], f[l][k] + f[r][j-k-1] + val[u] ); } } }
voidsolve( ){ cin >> n >> q; for( int i = 1; i < n; ++ i ) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); }
int n, m; vector<int> adj[maxn]; int siz[maxn]; ll wei[maxn], val[maxn]; ll f[maxn][maxn];
voiddfs( int u, int p ){ siz[u] = 1; for( int j = 0; j <= m; ++ j ) f[u][j] = -inf; f[u][0] = 0;
if( u > n - m ) { f[u][1] = val[u]; return; }
for( int v : adj[u] ) { if( v == p ) continue; dfs( v, u ); siz[u] += siz[v]; for( int j = min( siz[u], m ); j >= 1; -- j ) { for( int k = 1; k <= min( siz[v], j ); ++ k ) { if( f[u][j-k] == -inf || f[v][k] == -inf ) continue; f[u][j] = max( f[u][j], f[u][j-k] + f[v][k] - wei[v] ); } } } }
voidsolve( ){ n = read( ), m = read( ); for( int i = 1; i <= n - m; ++ i ) { int k = read( ); for( int j = 1; j <= k; ++ j ) { int v = read( ), w = read( ); adj[i].push_back( v ); wei[v] = w; } } for( int i = n - m + 1; i <= n; ++ i ) val[i] = read( );
voidsolve( ){ n = read( ), m = read( ); for( int i = 1; i < n; ++ i ) { int u = read( ) + 1, v = read( ) + 1; adj[u].push_back( v ); adj[v].push_back( u ); }
dfs( 1, 0 );
ll ans = 0; for( int j = 0; j <= m; ++ j ) { ans = max({ ans, f[1][j][0], f[1][j][1] }); } cout << ans << '\n'; }
for( int k = min( j, sz[v] ); k >= 1; -- k ) { if( f[u][j-k] == -1 ) continue; ll tot = ( k * ( m-k ) + ( sz[v]-k ) * ( n-sz[v]-m+k ) ) * w; f[u][j] = max( f[u][j], f[u][j-k] + f[v][k] + tot ); } } } }
voidsolve( ){ n = read( ), m = read( ); for( int i = 1; i < n; ++ i ) { int u = read( ), v = read( ); ll w = read( ); adj[u].push_back({ v, w }); adj[v].push_back({ u, w }); }
vector<int> adj[maxn], dag[maxn]; stack<int> st; int dfn[maxn], low[maxn], timer; bool in_stack[maxn]; int scc[maxn], scc_cnt; int fa[maxn], indeg[maxn]; ll val[maxn], scc_val[maxn]; ll wei[maxn], scc_wei[maxn]; ll dp[maxn][maxm]; int n, m;
voiddfs( int u ){ for( int j = scc_wei[u]; j <= m; ++ j ) { dp[u][j] = scc_val[u]; }
for( int v : dag[u] ) { dfs( v ); for( int j = m; j >= scc_wei[u]; -- j ) { for( int k = 0; k <= j - scc_wei[u]; ++ k ) { dp[u][j] = max( dp[u][j], dp[u][j-k] + dp[v][k] ); } } } }
voidtarjan( int u ){ dfn[u] = low[u] = ++ timer; st.push( u ); in_stack[u] = 1;