5 1 1 2 1 3 1 1 1
3 2 3 4 4
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
#define M 10005
vector<int>  adj[M],wi[M];
ll f[M][2];
int vis[M];
ll dfs1(int u){
    vis[u]=1;
    f[u][0]=0;
    for(int i=0;i<adj[u].size();i++){
        int v=adj[u][i];
        int w=wi[u][i];
        if(vis[v])   continue;
        f[u][0]=max(f[u][0],dfs1(v)+w);
    }
    return f[u][0];
}
void dfs2(int u){
    vis[u]=1;
    int m1=0,m2=0,v1,v2;
    for(int i=0;i<adj[u].size();i++){
        int v=adj[u][i];
        int w=wi[u][i];
        if(vis[v])  continue;
        int tmp=f[v][0]+w;
        if(tmp>m1){
            m2=m1,v2=v1;
            m1=tmp,v1=v;
        }
        else  if(m1==tmp || tmp>m2){
            m2=tmp,v2=v;
        }
    }
    if(u!=1){
        int tmp=f[u][1];
        int v=-1;
        if(tmp>m1){
            m2=m1,v2=v1;
            m1=tmp,v1=v;
        }
        else  if(m1==tmp || tmp>m2){
            m2=tmp,v2=v;
        }
    }
    for(int i=0;i<adj[u].size();i++){
        int v=adj[u][i];
        int w=wi[u][i];
        if(vis[v])  continue;
        if(v==v1)  f[v][1]=m2+w;
        else       f[v][1]=m1+w;
        dfs2(v);
    }
}
int main(){
    int n;
    while(cin>>n && n){
        for(int i=0;i<=n;i++)
            adj[i].clear(),wi[i].clear();
        for(int u=2;u<=n;u++){
            int v,w;
            cin>>v>>w;
            adj[u].push_back(v);
            wi[u].push_back(w);
            adj[v].push_back(u);
            wi[v].push_back(w);
        }
        memset(f,0,sizeof f);
        memset(vis,0,sizeof vis);
        dfs1(1);
        memset(vis,0,sizeof vis);
        dfs2(1);
        for(int j=1;j<=n;j++)
            cout<<max(f[j][0],f[j][1])<<endl;
    }
}
原文地址:http://blog.csdn.net/hyccfy/article/details/42914533