2012 ACM/ICPC Asia Regional Changchun Online-1010

来源:互联网 发布:js设置元素样式 编辑:程序博客网 时间:2024/04/30 14:05

//一个经典的树形背包,直接用剩余的时间对除主干路之外的其他路进行背包就可以了

//代码如下:

 

#include<stdio.h>#include<string.h>#define N 510struct edge{    int to,c,next;}edge[N*2];int n,t,num[N],head[N],ant;void add(int a,int b,int c){    edge[ant].to=b;    edge[ant].c=c;    edge[ant].next=head[a];    head[a]=ant++;}int dp[N][N],next[N],sum;int find(int root,int parent){    int i,to,k;    if(root==n)        return 0;    for(i=head[root];i!=-1;i=edge[i].next)    {        to=edge[i].to;        if(to==parent)continue;        k=find(to,root);        if(k>=0)        {            next[root]=to;            return k+edge[i].c;        }    }    return -1;}int Max(int a,int b){return a<b?b:a;}void dfs(int root,int parent){    int i,to,k,j;    dp[root][0]=num[root];    for(i=head[root];i!=-1;i=edge[i].next)    {        to=edge[i].to;        if(to==parent)continue;        dfs(to,root);        for(j=t;j>0;j--)            for(k=j;k>=0;k--)                if(j-k-2*edge[i].c>=0)                    dp[root][j]=Max(dp[root][j],dp[root][k]+dp[to][j-k-2*edge[i].c]);    }}int ans[N];void dfs2(int root,int parent,int *ans){    int i,to,j,k;    for(i=head[root];i!=-1;i=edge[i].next)    {        to=edge[i].to;        if(to==parent)            continue;        if(to==next[root])        {            sum+=num[to];            continue;        }        for(j=t;j>0;j--)            for(k=j;k>=0;k--)                if(j-k-2*edge[i].c>=0)                    ans[j]=Max(ans[j],ans[k]+dp[to][j-k-2*edge[i].c]);    }    if(next[root]>0)        dfs2(next[root],root,ans);}int main(){    int a,b,c,k,i;    while(scanf("%d%d",&n,&t)!=EOF)    {        ant=0;        memset(head,-1,sizeof(head));        for(i=1;i<=n-1;i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        for(i=1;i<=n;i++)            scanf("%d",&num[i]);        memset(next,-1,sizeof(next));        k=find(1,-1);        if(t<k)            printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");        else         {            sum=num[1];            t-=k;            memset(dp,0,sizeof(dp));            dfs(1,-1);            memset(ans,0,sizeof(ans));            dfs2(1,-1,ans);            printf("%d\n",sum+ans[t]);        }    }    return 0;}


 

原创粉丝点击