洛谷 P2015 二叉苹果树 题解

题面

裸的树上背包:

设f[u][i]表示在以u为子树的树种选择i条边的最大值,则:f[u][i]=max(f[u][i],f[u][i-j-1]+f[v][k]+u到v的边权);

#include <bits/stdc++.h>
using namespace std;
struct littlestar{
    int to;
    int nxt;
    int w;
}star[2010];
int head[2010],cnt;
void add(int u,int v,int w)
{
    star[++cnt].to=v;
    star[cnt].nxt=head[u];
    star[cnt].w=w;
    head[u]=cnt;
}
int f[1010][1010];
int d[1001];
int n,q;
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=star[i].nxt){
        int v=star[i].to;
        if(v==fa) continue;
        dfs(v,u);
        d[u]+=d[v]+1;
        for(int j=min(d[u],q);j>=1;j--){
            for(int k=min(d[v],j-1);k>=0;k--){
                f[u][j]=max(f[u][j],f[u][j-k-1]+f[v][k]+star[i].w);
            }
        }
    }
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<n;i++)
    {
        int x,y,w;
        scanf("%d%d%d",&x,&y,&w);
        add(x,y,w);
        add(y,x,w);
    }
    dfs(1,0);
    cout<<f[1][q];
}

猜你喜欢

转载自www.cnblogs.com/kamimxr/p/11439285.html
今日推荐