Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6378 Accepted Submission(s): 3211
1 #include<iostream> 2 #include<string.h> 3 #include<algorithm> 4 #include<queue> 5 #include<math.h> 6 #include<stdlib.h> 7 #include<stack> 8 #include<stdio.h> 9 #include<ctype.h> 10 #include<map> 11 #include<vector> 12 #include<map> 13 using namespace std; 14 typedef struct acc 15 { 16 int id; 17 int val; 18 } ak; 19 vector<ak>vec[100005]; 20 bool vis[100005]; 21 typedef struct node 22 { 23 int id; 24 int mcost; 25 int scost; 26 int mid; 27 int sid; 28 node() 29 { 30 mcost = 0; 31 scost = 0; 32 mid = -1; 33 sid = -1; 34 } 35 } ss; 36 ss dp[100005]; 37 int father[1000005]; 38 void dfs1(int n); 39 void dfs2(int n); 40 int main(void) 41 { 42 int n,m; 43 while(scanf("%d",&n)!=EOF) 44 { 45 memset(father,-1,sizeof(father)); 46 int i,j; 47 memset(dp,0,sizeof(dp)); 48 for(i = 0; i < 100005; i++) 49 vec[i].clear(); 50 for(i = 2; i <= n; i++) 51 { 52 int id,val; 53 scanf("%d %d",&id,&val); 54 ak a; 55 a.val = val; 56 a.id = i; 57 father[i] = id; 58 vec[id].push_back(a); 59 } 60 dfs1(1); 61 dfs2(1); 62 for(i = 1; i <= n; i++) 63 { 64 printf("%d\n",dp[i].mcost); 65 } 66 } 67 return 0; 68 } 69 void dfs1(int n) 70 { 71 for(int i = 0; i < vec[n].size(); i++) 72 { 73 ak d = vec[n][i]; 74 { 75 dfs1(d.id); 76 if(dp[d.id].mcost+d.val > dp[n].mcost) 77 { 78 dp[n].scost = dp[n].mcost; 79 dp[n].sid = dp[n].mid; 80 dp[n].mcost = dp[d.id].mcost+d.val; 81 dp[n].mid = d.id; 82 } 83 else if(dp[d.id].mcost+d.val > dp[n].scost) 84 { 85 dp[n].scost = dp[d.id].mcost+d.val; 86 dp[n].sid = d.id; 87 } 88 } 89 } 90 } 91 void dfs2(int n) 92 { 93 for(int i = 0; i < vec[n].size(); i++) 94 { 95 ak d = vec[n][i]; 96 if(dp[n].mid!=d.id) 97 { 98 if(dp[n].mcost + d.val > dp[d.id].mcost) 99 { 100 dp[d.id].scost = dp[d.id].mcost; 101 dp[d.id].sid = dp[d.id].mid; 102 dp[d.id].mcost = dp[n].mcost + d.val; 103 dp[d.id].mid = n; 104 } 105 else if(dp[n].mcost + d.val > dp[d.id].scost) 106 { 107 dp[d.id].scost = dp[n].mcost + d.val; 108 dp[d.id].sid = n; 109 } 110 } 111 else 112 { 113 if(dp[n].scost + d.val > dp[d.id].mcost) 114 { 115 dp[d.id].scost = dp[d.id].mcost; 116 dp[d.id].sid = dp[d.id].mid; 117 dp[d.id].mcost = dp[n].scost + d.val; 118 dp[d.id].mid = n; 119 } 120 else if(dp[n].scost + d.val > dp[d.id].scost) 121 { 122 dp[d.id].scost = dp[n].scost + d.val; 123 dp[d.id].sid = n; 124 } 125 } 126 dfs2(d.id); 127 } 128 }
原文:http://www.cnblogs.com/zzuli2sjy/p/6232574.html