洛谷 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]; }
标签:nxt,cnt,洛谷,min,int,题解,head,P2015,star 来源: https://www.cnblogs.com/kamimxr/p/11439285.html