fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. const int N = 1000005;
  6. int n;
  7. ll w[N], sub[N];
  8. vector<int> g[N];
  9. ll ans = 0;
  10.  
  11. void dfs1(int u, int p) {
  12. sub[u] = w[u];
  13. for (int v : g[u]) if (v != p) {
  14. dfs1(v,u);
  15. sub[u] += sub[v];
  16. }
  17. }
  18.  
  19. void dfs2(int u, int p) {
  20. ll best1=0, best2=0; int id1=-1;
  21. for (int v : g[u]) if (v != p) {
  22. if (sub[v] > best1) {best2=best1; best1=sub[v]; id1=v;}
  23. else if (sub[v] > best2) best2=sub[v];
  24. }
  25. ans = max(ans, sub[u]);
  26. for (int v : g[u]) if (v != p) {
  27. ll oldu=sub[u], oldv=sub[v];
  28. if (v==id1) {
  29. sub[u]=w[u]+best2;
  30. }
  31. sub[v]+=sub[u];
  32. dfs2(v,u);
  33. sub[u]=oldu; sub[v]=oldv;
  34. }
  35. }
  36.  
  37. int main() {
  38. ios::sync_with_stdio(false);
  39. cin.tie(nullptr);
  40. cin>>n;
  41. for(int i=1;i<=n;i++) cin>>w[i];
  42. for(int i=1;i<n;i++) {
  43. int u,v;cin>>u>>v;
  44. g[u].push_back(v);
  45. g[v].push_back(u);
  46. }
  47. dfs1(1,-1);
  48. dfs2(1,-1);
  49. cout<<ans<<"\n";
  50. }
  51.  
Success #stdin #stdout 0.01s 31084KB
stdin
6
1 2 3 4 5 6
1 2
2 3
2 4
5 6
4 5
stdout
24