二叉苹果树(树形D)

来源:互联网 发布:bigworld引擎全套源码 编辑:程序博客网 时间:2024/05/16 08:20
#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#define maxn 302#define inf 10000007using namespace std;struct data{    int x,y,z;};data lin[maxn*2];int n,d[maxn],f[maxn][maxn],q,tot[maxn],nxt[maxn*2],fst[maxn],cnt=0;void add(int xx,int yy,int ww){lin[++cnt].x=xx,lin[cnt].y=yy,lin[cnt].z=ww,nxt[cnt]=fst[xx],fst[xx]=cnt;lin[++cnt].x=yy,lin[cnt].y=xx,lin[cnt].z=ww,nxt[cnt]=fst[yy],fst[yy]=cnt;}int doit(int p,int t,int da){    if(f[p][t]>=0){return f[p][t];}int j=fst[p],l=0,r=0;for(int j=fst[p];j;j=nxt[j]){    if(lin[j].y==da)continue;    if(!l)l=lin[j].y;    else r=lin[j].y;}     for(int i=0;i<t;++i){if(tot[l]<i || (tot[r]<t-1-i))continue;    f[p][t]=max(f[p][t],doit(l,i,p)+doit(r,t-1-i,p));}f[p][t]+=d[p];   return (f[p][t]);}int findtot(int p,int da){tot[p]=1;    for(int i=fst[p];i;i=nxt[i]){    if(lin[i].y==da)continue;    d[lin[i].y]=lin[i].z;    f[lin[i].y][1]=lin[i].z;    tot[p]+=findtot(lin[i].y,p);}return tot[p];}int main(){int fa,sn,w;    scanf("%d%d",&n,&q);++q;    memset(f,128,sizeof(f));    for(int i=2;i<=n;++i){    scanf("%d%d%d",&fa,&sn,&w);    add(fa,sn,w);    f[i][0]=0;}d[1]=0;tot[1]=findtot(1,1);doit(1,q,1);printf("%d\n",f[1][q]);}


0 0