Time Limit: 1000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 2764 Accepted
Submission(s): 1415
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAX 11111 5 using namespace std; 6 typedef long long int LL; 7 typedef struct{ 8 int to, next, w; 9 }Node; 10 Node edge[MAX]; 11 LL head[MAX], dp[MAX][3]; 12 void AddEdge(int u, int v, int w, int i){ 13 edge[i].to = v; 14 edge[i].w = w; 15 edge[i].next = head[u]; 16 head[u] = i; 17 } 18 void dfs_to_son(int i){ 19 LL bigest = 0, biger = 0; 20 for(int j = head[i];j != -1;j = edge[j].next){ 21 int v = edge[j].to; 22 dfs_to_son(v); 23 LL temp = dp[v][0] + edge[j].w; 24 if(bigest <= temp){ 25 biger = bigest; 26 bigest = temp; 27 }else if(temp > biger) biger = temp; 28 } 29 dp[i][0] = bigest; 30 dp[i][1] = biger; 31 } 32 void dfs_to_father(int i){ 33 for(int j = head[i];j != -1;j = edge[j].next){ 34 int v = edge[j].to; 35 dp[v][2] = max(dp[i][2], dp[v][0] + edge[j].w == dp[i][0] ? dp[i][1]:dp[i][0]) + edge[j].w; 36 dfs_to_father(v); 37 } 38 } 39 int main(){ 40 int n, u, w; 41 /* freopen("in.c", "r", stdin); */ 42 while(~scanf("%d", &n)){ 43 memset(dp, 0, sizeof(dp)); 44 memset(head, -1, sizeof(head)); 45 for(int i = 2;i <= n;i ++){ 46 scanf("%d%d", &u, &w); 47 AddEdge(u, i, w, i-1); 48 } 49 dfs_to_son(1); 50 dfs_to_father(1); 51 for(int i = 1;i <= n;i ++) printf("%lld\n", max(dp[i][2], dp[i][0])); 52 } 53 return 0; 54 }
HDOJ --- 2196 Computer,布布扣,bubuko.com
原文:http://www.cnblogs.com/anhuizhiye/p/3643945.html