hdu 2196 动态规划 树型DP
题意:给一棵树,以及边上的权值,求每个结点到其它结点的最大权值
分析:两次DFS
第一次由底向上确定每个结点到叶子结点的最大权值
第二次由上到下确定每个结点经过父结点的最大权值,并确定最终答案
const int MaxN=10005; int a[MaxN][300], v[MaxN][300], p[MaxN]; int succ[MaxN], pred[MaxN], ans[MaxN]; int dfs1(int x){ if(p[x]){ FOR(i, 0, p[x]) { int temp = v[x][i] + dfs1(a[x][i]); checkmax(succ[x], temp); } } return succ[x]; } void dfs2(int x){ FOR(i, 0, p[x]) { pred[a[x][i]] = pred[x] + v[x][i]; FOR(j, 0, p[x]) { if(i == j) continue; checkmax(pred[a[x][i]], succ[a[x][j]]+v[x][i]+v[x][j]); } dfs2(a[x][i]); } ans[x] = max(succ[x],pred[x]); } int main(){ int n, f, val; while(scanf("%d",&n) == 1){ memset(p,0,sizeof p); memset(succ,0,sizeof succ); pred[1]=0; FOE(i, 2, n){ scanf("%d%d", &f, &val); a[f][p[f]]=i; v[f][p[f]++]=val; } dfs1(1); dfs2(1); FOE(i, 1, n) printf("%d\n",ans[i]); } return 0; }