fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4. ll sum[1000];
  5. int b[1000];
  6.  
  7. void DFS(int node, vector<int> G[], int used[], int parent[]) {
  8. used[node] = 1;
  9. for (auto u : G[node]) {
  10. if (used[u] == 0) {
  11. parent[u] = node;
  12. DFS(u, G, used, parent);
  13. }
  14. }
  15.  
  16. // Bottom-up traversal
  17. ll s = 0;
  18. for (auto c : G[node]) {
  19. if (c == parent[node]) {
  20. // Ignore the parent node
  21. continue;
  22. } else {
  23. s += sum[c];
  24. }
  25. }
  26. sum[node] = b[node] + s;
  27. }
  28.  
  29. int main() {
  30. int n;
  31. cin >> n;
  32. vector<int> g[n + 1];
  33. for (int i = 1; i <= n; i++) {
  34. cin >> b[i];
  35. }
  36.  
  37. for (int i = 1; i <= n - 1; i++) {
  38. int u, v;
  39. cin >> u >> v;
  40. g[u].push_back(v);
  41. g[v].push_back(u);
  42. }
  43.  
  44. int used[n + 1] = {0};
  45. int parent[n + 1] = {0};
  46. DFS(1, g, used, parent);
  47.  
  48. ll s = INT_MIN;
  49. for (int i = 1; i <= n; i++) {
  50. s = max(s, sum[i]);
  51. }
  52.  
  53. cout << s;
  54. return 0;
  55. }
  56.  
Success #stdin #stdout 0s 5284KB
stdin
5
5 7 -10 4 15 
1 2
2 3 
3 4 
1 5 
stdout
21