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