E75【模板】树上背包 P2015 二叉苹果树
视频链接:E75【模板】树上背包 P2015 二叉苹果树_哔哩哔哩_bilibili
E18【模板】树上背包 P2014 [CTSC1997] 选课 - 董晓 - 博客园
P2015 二叉苹果树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
// 树上背包 O(n*m) #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define N 105 int head[N],idx; struct E{int to,w,ne;}e[N<<1]; void add(int x,int y,int z){ e[++idx]={y,z,head[x]};head[x]=idx; } int n,m,f[N][N],siz[N]; void dfs(int u,int fa){ for(int i=head[u];i;i=e[i].ne){ int v=e[i].to; if(v==fa)continue; dfs(v,u); siz[u]+=siz[v]+1; for(int j=min(m,siz[u]);j;--j) //边数 for(int k=min(j-1,siz[v]);k>=0;--k) //决策 f[u][j]=max(f[u][j],f[u][j-k-1]+f[v][k]+e[i].w); } } int main(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<n;++i) scanf("%d%d%d",&u,&v,&w), add(u,v,w),add(v,u,w); dfs(1,0); printf("%d\n",f[1][m]); }
// 树上背包 O(n*m) #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define N 105 int head[N],idx; struct E{int to,w,ne;}e[N<<1]; void add(int x,int y,int z){ e[++idx]={y,z,head[x]};head[x]=idx; } int n,m,ans,f[N][N],siz[N]; void dfs(int u,int fa,int t){ if(t<=0) return; for(int i=head[u];i;i=e[i].ne){ int v=e[i].to; if(v==fa) continue; for(int j=m-1;j>=0;j--) f[v][j]=f[u][j]+e[i].w; dfs(v,u,t-1); for(int j=m;j>=1;--j) f[u][j]=max(f[u][j],f[v][j-1]); } } int main(){ scanf("%d%d",&n,&m); for(int i=1,u,v,w;i<n;++i) scanf("%d%d%d",&u,&v,&w), add(u,v,w),add(v,u,w); dfs(1,0,m); printf("%d\n",f[1][m]); }