标签:
5 10 1 2 2 2 3 2 2 5 3 3 4 3 1 2 3 4 5
11
#include<stdio.h> #include<string.h> #include<queue> #include<string> #include<iostream> #define max(a,b) (a>b?a:b) #define INF 0xfffffff using namespace std; int n,t; int a[110],head[110],vis[110],cnt,pre[110],dis[110],d[220],dp[110][10100]; struct s { int u,v,w,next; }edge[220]; void add(int u,int v,int w) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } void spfa(int u) { int i; for(i=1;i<=n;i++) { dis[i]=INF; pre[i]=i; d[i]=0; } memset(vis,0,sizeof(vis)); vis[u]=1; dis[u]=0; queue<int>q; q.push(u); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; pre[v]=u; d[v]=i; if(!vis[v]) { vis[v]=1; q.push(v); } } } } for(i=n;i!=1;i=pre[i]) { edge[d[i]].w=0; edge[d[i]^1].w=0; } } void dfs(int u,int pre) { int i,j,k; for(i=0;i<=t;i++) { dp[u][i]=a[u]; } for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(v==pre) continue; dfs(v,u); int cost=edge[i].w*2; for(j=t;j>=cost;j--) { for(k=0;k+cost<=j;k++) { dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k-cost]); } } } } int main() { while(scanf("%d%d",&n,&t)!=EOF) { int i; memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); cnt=0; for(i=0;i<n-1;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } for(i=1;i<=n;i++) { scanf("%d",&a[i]); } spfa(1); if(dis[n]>t) { printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n"); continue; } t-=dis[n]; dfs(1,-1); printf("%d\n",dp[1][t]); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 题目4276 The Ghost Blows Light(SPFA+树形DP)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47091705