hdu4003 树形dp
Posted shatianming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu4003 树形dp相关的知识,希望对你有一定的参考价值。
嘛,可以发现,,,,,如果要全部走回来 单独一个走一定比多个一起走更优
于是只用考虑一个单独走回来和多个一起走不回来的情况就好了
#include<bits/stdc++.h> #define MAXN 10005 using namespace std; int n,s,k,tot,f[MAXN][25]; int h[MAXN]; struct node{ int from,to,next,cost; }e[MAXN<<1]; void init(){ tot=0; memset(h,-1,sizeof(h)); memset(f,0,sizeof(f)); } void add(int x,int y,int z){ tot++; e[tot].from=x; e[tot].to=y; e[tot].cost=z; e[tot].next=h[x]; h[x]=tot; } int dfs(int now,int fa){ for(int i=h[now];i!=(-1);i=e[i].next){ if(e[i].to!=fa){ dfs(e[i].to,now); for(int j=k;j>=0;j--){ f[now][j]=f[e[i].to][0]+f[now][j]+e[i].cost*2; for(int p=1;p<=j;p++) f[now][j]=min(f[now][j],f[e[i].to][p]+f[now][j-p]+e[i].cost*p); } } } } int main(){ while(scanf("%d%d%d",&n,&s,&k)==3){ init(); for(int i=1;i<n;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(s,s); cout<<f[s][k]<<endl; } }
以上是关于hdu4003 树形dp的主要内容,如果未能解决你的问题,请参考以下文章
HDU4003Find Metal Mineral[树形DP 分组背包]
POJ1849Two[DP|树的直径](扩展HDU4003待办)