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