经典的树形DP。。。
Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
5 1 1 2 1 3 1 1 1
Sample Output
3 2 3 4 4
Source
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=22000; const int INF=0x3f3f3f3f; int Adj[maxn],Size; struct E { int to,next,len; }Edge[maxn]; void init() { Size=0; memset(Adj,-1,sizeof(Adj)); } void Add_Edge(int u,int v,int w) { Edge[Size].to=v; Edge[Size].len=w; Edge[Size].next=Adj[u]; Adj[u]=Size++; } int n,dp[maxn][3]; void dfs1(int f,int u) { int biggest=0,bigger=0; for(int i=Adj[u];~i;i=Edge[i].next) { int v=Edge[i].to; int w=Edge[i].len; if(v==f) continue; dfs1(u,v); int temp=dp[v][0]+w; if(temp>=biggest) { bigger=biggest; biggest=temp; } else if(temp>bigger) { bigger=temp; } } dp[u][0]=biggest; dp[u][1]=bigger; } void dfs2(int f,int u) { for(int i=Adj[u];~i;i=Edge[i].next) { int v=Edge[i].to; int w=Edge[i].len; if(v==f) continue; dp[v][2]=max(dp[u][2],(dp[v][0]+w==dp[u][0])?dp[u][1]:dp[u][0]) + w ; dfs2(u,v); } } int main() { while(scanf("%d",&n)!=EOF) { init(); for(int i=2;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); Add_Edge(i,a,b); Add_Edge(a,i,b); } memset(dp,0,sizeof(dp)); dfs1(-1,1); dfs2(-1,1); for(int i=1;i<=n;i++) { printf("%d\n",max(dp[i][0],dp[i][2])); } } return 0; }
原文:http://blog.csdn.net/u012797220/article/details/18940215