BZOJ_1812_[Ioi2005]riv_树形DP
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 205 int head[N],to[N],nxt[N],val[N],w[N],cnt,fa[N][N],siz[N],sf[N],dis[N],g[N][N],m,n; int f[N][N][N]; inline void add(int u,int v,int z) { to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=z; } void dfs(int x) { int i,j,k,l;siz[x]=1; fa[x][0]=x; for(i=0;i<=sf[x];i++) { f[x][i][!i]=(dis[x]-dis[fa[x][i]])*w[x]; } for(i=head[x];i;i=nxt[i]) { dis[to[i]]=dis[x]+val[i]; for(j=0;j<=sf[x];j++) fa[to[i]][++sf[to[i]]]=fa[x][j]; dfs(to[i]); memset(g,0x3f,sizeof(g)); for(j=0;j<=sf[x];j++) { for(k=min(m,siz[x]);k>=0;k--) { for(l=min(m-k,siz[to[i]]);l>=0;l--) { g[j][k+l]=min(g[j][k+l],f[x][j][k]+min(f[to[i]][j+1][l],f[to[i]][0][l])); } } } siz[x]+=siz[to[i]]; for(j=0;j<=sf[x];j++) { for(k=min(m,siz[x]);k>=0;k--) { f[x][j][k]=g[j][k]; } } } } int main() { memset(f,0x3f,sizeof(f)); // freopen("riv.in","r",stdin); // freopen("riv.out","w",stdout); scanf("%d%d",&n,&m);m++; int i,z; for(i=1;i<=n;i++) { scanf("%d%d%d",&w[i],&fa[i][1],&z); add(fa[i][1],i,z); } dfs(0); printf("%d\n",f[0][0][m]); } /* 4 2 1 0 1 1 1 10 10 2 5 1 2 3 */ /* 8 2 233 0 5 9 1 80 27 2 20 64 1 100 2 3 14 81 4 5 10 3 70 10 5 8 */
原文:https://www.cnblogs.com/suika/p/9204290.html