Guest User

Untitled

a guest
Mar 27th, 2016
2,338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <cassert>
  5. #include <ctime>
  6. #include <cstring>
  7. #include <string>
  8. #include <set>
  9. #include <map>
  10. #include <vector>
  11. #include <list>
  12. #include <deque>
  13. #include <queue>
  14. #include <sstream>
  15. #include <iostream>
  16. #include <algorithm>
  17.  
  18. using namespace std;
  19.  
  20. #define pb push_back
  21. #define mp make_pair
  22. #define fs first
  23. #define sc second
  24.  
  25. const double pi = acos(-1.0);
  26. const int size = 1000 * 1000 + 100;
  27.  
  28. int n;
  29. long long a[size];
  30. long long insubtree[size];
  31. long long longest[size];
  32. long long ans = 0;
  33.  
  34. vector <int> vertex[size];
  35.  
  36. void dfs1(int v, int f) {
  37. vector <long long> mxs;
  38. longest[v] = a[v];
  39. insubtree[v] = a[v];
  40. for (int i = 0; i < (int) vertex[v].size(); i++) {
  41. if (vertex[v][i] != f) {
  42. dfs1(vertex[v][i], v);
  43. longest[v] = max(longest[v], longest[vertex[v][i]] + a[v]);
  44. insubtree[v] = max(insubtree[v], insubtree[vertex[v][i]]);
  45. mxs.pb(longest[vertex[v][i]]);
  46. }
  47. }
  48.  
  49. sort(mxs.rbegin(), mxs.rend());
  50.  
  51. if ((int) mxs.size() > 0) {
  52. insubtree[v] = max(insubtree[v], mxs[0] + a[v]);
  53. }
  54. if ((int) mxs.size() > 1) {
  55. insubtree[v] = max(insubtree[v], mxs[0] + mxs[1] + a[v]);
  56. }
  57. }
  58.  
  59. void dfs2(int v, int f, long long best, long long lgt) {
  60. ans = max(ans, insubtree[v] + best);
  61.  
  62. set <pair <long long, int> > bestset;
  63. set <pair <long long, int> > lgtset;
  64. bestset.insert(mp(best, -1));
  65. lgtset.insert(mp(lgt, -1));
  66.  
  67. for (int i = 0; i < (int) vertex[v].size(); i++) {
  68. if (vertex[v][i] != f) {
  69. bestset.insert(mp(insubtree[vertex[v][i]], i));
  70. lgtset.insert(mp(longest[vertex[v][i]], i));
  71. }
  72. }
  73.  
  74. for (int i = 0; i < (int) vertex[v].size(); i++) {
  75. if (vertex[v][i] != f) {
  76. bestset.erase(mp(insubtree[vertex[v][i]], i));
  77. lgtset.erase(mp(longest[vertex[v][i]], i));
  78.  
  79. long long nb = bestset.rbegin()->fs;
  80. long long curb = a[v];
  81. set <pair <long long, int> >::iterator it = lgtset.end();
  82. if (lgtset.size() > 0) {
  83. --it;
  84. curb += it->fs;
  85. }
  86. if (lgtset.size() > 1) {
  87. --it;
  88. curb += it->fs;
  89. }
  90.  
  91. dfs2(vertex[v][i], v, max(nb, curb), lgtset.rbegin()->fs + a[v]);
  92.  
  93. bestset.insert(mp(insubtree[vertex[v][i]], i));
  94. lgtset.insert(mp(longest[vertex[v][i]], i));
  95. }
  96. }
  97. }
  98.  
  99. int main() {
  100. scanf("%d", &n);
  101. for (int i = 0; i < n; i++)
  102. scanf("%lld", &a[i]);
  103.  
  104. for (int i = 0; i < n - 1; i++) {
  105. int v, u;
  106.  
  107. scanf("%d%d", &u, &v);
  108. u--, v--;
  109.  
  110. vertex[v].pb(u);
  111. vertex[u].pb(v);
  112. }
  113.  
  114. dfs1(0, -1);
  115. ans = 0ll;
  116.  
  117. dfs2(0, -1, 0ll, 0ll);
  118.  
  119. printf("%lld\n", ans);
  120.  
  121. return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment