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