http://acm.hdu.edu.cn/showproblem.php?pid=4276
一般题目是求回到原地,而这道题规定从1进n出。所以1-n这条路是必走,其他走不走无所谓。
这样很自然通过dfs先处理1-n这条路,统计这条路的花费时间cost,同时将这条上的边权设为0。
接下来就是求m-cost时间遍历能产生的最大价值,也就是最普通的问题。在这里因为1-n这条路边权已经为0,所以一定会走,只要m-cost时间能回到1点就行。
所以我觉得将1-n边权置为0是这道题的点睛之笔。
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <cctype> #include <vector> #include <iterator> #include <set> #include <map> #include <sstream> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define pb push_back #define debug printf("! ") #define MAXN 1000+5 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define pqueue priority_queue #define INF 0x3f3f3f3f int n,m; struct node{int y,val,next;}tree[MAXN<<2]; int head[MAXN],vis[MAXN],ptr=1,dp[MAXN][MAXN],a[MAXN],vis2[MAXN]; void init() { mem(head,-1); mem(vis,0); mem(vis2,0); mem(dp,0); ptr=1; } void add(int x,int y,int val) { tree[ptr].y = y; tree[ptr].val = val; tree[ptr].next = head[x]; head[x] = ptr++; } int cost; void dfs(int rt) { vis[rt]=1; for(int i = 0;i<=m;i++) dp[rt][i] = a[rt]; for(int i = head[rt];i!=-1;i=tree[i].next) { int y = tree[i].y; if(vis[y]) continue; dfs(y); for(int j=m;j>=0;j--) { for(int k=0;k<=j;k++) { if(j-k-2*tree[i].val>=0) dp[rt][j] = max(dp[rt][j],dp[rt][j-k-2*tree[i].val]+dp[y][k]); } } } } bool dfs2(int rt) { vis2[rt] = 1; for(int i = head[rt];i!=-1;i=tree[i].next) { int y = tree[i].y; if(vis2[y]) continue; if(y==n) { cost+=tree[i].val; return true; } if(dfs2(y)) { cost+=tree[i].val; tree[i].val = 0; return true; } } } int main() { int i,j,k,t; while(~sf("%d%d",&n,&m)) { init(); cost = 0; for(i=1;i<n;i++) { int x,y,z; sf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } for(i=1;i<=n;i++) sf("%d",&a[i]); dfs2(1); if(cost>m) { pf("Human beings die in pursuit of wealth, and birds die in pursuit of food! "); continue; } m-=cost; dfs(1); pf("%d ",dp[1][m]); } }