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;
    }
}
View Code