洛谷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\n",dp[1][m]); return 0; }