洛谷P2015 二叉苹果树

树形背包+一点小改动

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define maxn 110

using namespace std;

struct node
{
    int ed,len,nxt;
};
node edge[maxn<<1];
int n,m,cnt,first[maxn],dp[maxn][maxn],siz[maxn];

inline void add_edge(int s,int e,int d)
{
    ++cnt;
    edge[cnt].ed=e;
    edge[cnt].len=d;
    edge[cnt].nxt=first[s];
    first[s]=cnt;
    return;
}

inline void dfs(int now,int fa)
{
    for(register int i=first[now];i;i=edge[i].nxt)
    {
        int e=edge[i].ed;
        if(e!=fa)
        {
            dfs(e,now);
            siz[now]=siz[now]+siz[e]+1;
            for(register int j=min(siz[now],m);j>=0;--j)
                for(register int k=min(j-1,siz[e]);k>=0;--k)
                    dp[now][j]=max(dp[now][j],dp[now][j-k-1]+dp[e][k]+edge[i].len);
        }
    }
    return;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n-1;++i)
    {
        int s,e,d;
        scanf("%d%d%d",&s,&e,&d);
        add_edge(s,e,d);
        add_edge(e,s,d);
    }
    dfs(1,0);
    printf("%d
",dp[1][m]);
    return 0;
}
原文地址:https://www.cnblogs.com/Hoyoak/p/11829016.html