fork download
  1. #include <cstdio>
  2. #include <vector>
  3. using namespace std;
  4. int max_v(int a, int b){ return a > b ? a : b; }
  5. //vector<int> cost; // 1,000,000
  6. vector<vector<int>> adj;
  7. //vector<bool> vi;
  8.  
  9. int cost[1000001], ans = 0;
  10. bool vi[1000001];
  11. int dfs(int vn, int p_max){
  12. vi[vn] = 1;
  13. int ret = cost[vn], subsum=p_max, p = max_v(cost[vn], p_max), c;
  14.  
  15. for(int& v : adj[vn])
  16. if(!vi[v]){
  17. c = dfs(v, p);
  18. ret = max_v(ret, c);
  19. subsum += c;
  20. }
  21. ans = max_v(ans, subsum);
  22. return ret;
  23. }
  24.  
  25. int main() {
  26. int N,u,v,i;
  27. scanf("%d",&N);
  28. adj.resize(N+1);
  29. //cost.resize(N),
  30. //vi = vector<bool>(N, false);
  31. for(i=0;i<N;i++) scanf("%d",&cost[i]);
  32. for(i=0;i<N-1;i++){
  33. scanf("%d%d",&u,&v);
  34. u--,v--;
  35. adj[u].push_back(v);
  36. adj[v].push_back(u);
  37. }
  38. dfs(0,0);
  39. printf("%d",ans);
  40. return 0;
  41. }
Success #stdin #stdout 0s 4396KB
stdin
5
1 1 1 1 2
1 2
2 3
2 4
1 5
stdout
3