hdu 2196 树状dp

两边dfs 即可

#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
using namespace std;
#define LL __int64
const LL N=10000+10;
const LL INF=INT_MAX;
vector< pair<LL,LL> > G[N];
bool vis[N];
pair<LL,LL > low[N];
LL low_id[N],up[N];
void dfs1(LL u){
    vis[u]=1;
    for(LL i=0;i<G[u].size();i++){
        LL v=G[u][i].first,w=G[u][i].second;
        if(!vis[v]){
            dfs1(v);
            //if(u==2){
            //    cout<<vis[v]<<" "<<v<<" "<<low[v].first+w<<endl;
            //}
            if(low[v].first+w>=low[u].first){
                low[u].second=low[u].first;
                low[u].first=low[v].first+w;
                low_id[u]=v;
            }else low[u].second=max(low[v].first+w,low[u].second);
        }
    }
}
void dfs2(LL u){
    vis[u]=1;
    for(LL i=0;i<G[u].size();i++){
        LL v=G[u][i].first,w=G[u][i].second;
        if(!vis[v]){
            /*cout<<vis[v]<<" "<<v<<" "<<low[v].first+w<<endl;*/
            if(low_id[u]!=v){
                up[v]=low[u].first+w;
            }else up[v]=low[u].second+w;
            up[v]=max(up[u]+w,up[v]);
            dfs2(v);
        }
    }
}
int main(){
    LL n;
    while(scanf("%I64d",&n)!=EOF){
        for(LL i=1;i<=n;i++){
            G[i].clear();
            low[i].first=0,low[i].second=0,up[i]=0,low_id[i]=0;
        }
        for(LL i=2;i<=n;i++){
            LL u,w;
            scanf("%I64d%I64d",&u,&w);
            G[i].push_back(make_pair(u,w));
            G[u].push_back(make_pair(i,w));
        }
        //cout<<endl;
        //for(LL i=1;i<=n;i++){
        //    cout<<i<<" : ";
        //    for(LL j=0;j<G[i].size();j++){
        //        cout<<G[i][j].first<<" "<<G[i][j].second<<" | ";
        //    }
        //    cout<<endl;
        //}
        memset(vis,0,sizeof(vis));
        dfs1(1);
        memset(vis,0,sizeof(vis));
        dfs2(1);
        for(LL i=1;i<=n;i++){
            //cout<<low[i].first<<" "<<low[i].second<<" "<<up[i]<<endl;
            printf("%I64d\n",max(low[i].first,up[i]));
        }
    }
}
posted @ 2012-04-24 19:42  HaoHua_Lee  阅读(171)  评论(0编辑  收藏  举报