fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int N = 200005;
  7. int n;
  8. int w[N], sub[N], dp[N];
  9. vector<int> adj[N];
  10. int res = 0;
  11.  
  12. void dfs_sub(int u, int p) {
  13. sub[u] = w[u];
  14. for (int v : adj[u]) if (v != p) {
  15. dfs_sub(v, u);
  16. sub[u] += sub[v];
  17. }
  18. }
  19.  
  20. void dfs_dp(int u, int p) {
  21. dp[u] = sub[u];
  22. int best1 = 0, best2 = 0; // top 2 child contributions
  23. for (int v : adj[u]) if (v != p) {
  24. dfs_dp(v, u);
  25. dp[u] = max(dp[u], sub[u] + dp[v]);
  26. int val = dp[v];
  27. if (val > best1) {
  28. best2 = best1;
  29. best1 = val;
  30. } else if (val > best2) {
  31. best2 = val;
  32. }
  33. }
  34. res = max(res, sub[u] + best1 + best2);
  35. }
  36.  
  37. int32_t main() {
  38. ios::sync_with_stdio(false);
  39. cin.tie(nullptr);
  40.  
  41. cin >> n;
  42. for (int i = 1; i <= n; i++) cin >> w[i];
  43. for (int i = 1; i < n; i++) {
  44. int u, v;
  45. cin >> u >> v;
  46. adj[u].push_back(v);
  47. adj[v].push_back(u);
  48. }
  49.  
  50. dfs_sub(1, 0);
  51. dfs_dp(1, 0);
  52.  
  53. cout << res << "\n";
  54. return 0;
  55. }
  56.  
Success #stdin #stdout 0.01s 10884KB
stdin
6
1 2 3 4 5 6
1 2
2 3
2 4
5 6
4 5
stdout
73