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

 

posted @ 2013-06-19 14:06  心向往之  阅读(185)  评论(0)    收藏  举报