fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. const int N = 200005;
  6.  
  7. int n, w[N];
  8. vector<int> adj[N];
  9. int sub[N];
  10. int best1[N], best2[N]; // 2 nhánh con tốt nhất
  11. int res = 0;
  12.  
  13. void dfs1(int u, int p) {
  14. sub[u] = w[u];
  15. best1[u] = best2[u] = 0;
  16.  
  17. for (int v : adj[u]) if (v != p) {
  18. dfs1(v, u);
  19. sub[u] += sub[v];
  20. int val = sub[v];
  21. if (val > best1[u]) {
  22. best2[u] = best1[u];
  23. best1[u] = val;
  24. } else if (val > best2[u]) {
  25. best2[u] = val;
  26. }
  27. }
  28. }
  29.  
  30. void dfs2(int u, int p) {
  31. // cập nhật đáp án tại u
  32. res = max(res, sub[u] + best1[u] + best2[u]);
  33.  
  34. for (int v : adj[u]) if (v != p) {
  35. // giả sử ta reroot sang v
  36. int su = sub[u], sv = sub[v];
  37.  
  38. // giá trị "ngoài v" khi xem từ u
  39. int outside = su - sv;
  40. int candidate = outside;
  41.  
  42. // Nếu v chính là best1[u] thì nhánh mạnh nhất ngoài v là best2[u]
  43. if (sub[v] == best1[u]) candidate = max(candidate, best2[u]);
  44. else candidate = max(candidate, best1[u]);
  45.  
  46. // cập nhật best cho v bằng cách xét nhánh từ u
  47. int old1 = best1[v], old2 = best2[v];
  48. if (candidate > best1[v]) {
  49. best2[v] = best1[v];
  50. best1[v] = candidate;
  51. } else if (candidate > best2[v]) {
  52. best2[v] = candidate;
  53. }
  54.  
  55. // reroot
  56. sub[v] = sv + (su - sv);
  57.  
  58. dfs2(v, u);
  59.  
  60. // rollback
  61. sub[v] = sv;
  62. best1[v] = old1;
  63. best2[v] = old2;
  64. }
  65. }
  66.  
  67. int32_t main() {
  68. ios::sync_with_stdio(false);
  69. cin.tie(nullptr);
  70.  
  71. cin >> n;
  72. for (int i = 1; i <= n; i++) cin >> w[i];
  73. for (int i = 1; i < n; i++) {
  74. int u, v;
  75. cin >> u >> v;
  76. adj[u].push_back(v);
  77. adj[v].push_back(u);
  78. }
  79.  
  80. dfs1(1, 0);
  81. dfs2(1, 0);
  82.  
  83. cout << res << "\n";
  84. }
  85.  
Success #stdin #stdout 0.01s 12260KB
stdin
6
1 2 3 4 5 6
1 2
2 3
2 4
5 6
4 5
stdout
41