Advertisement
win11905

Untitled

Oct 19th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <functional>
  5. #include <iterator>
  6. #include <bitset>
  7. #include <map>
  8. #include <queue>
  9. #define P pair<int, int>
  10. #define x first
  11. #define y second
  12. #define long long long
  13. #define all(x) (x).begin(), (x).end()
  14. #define input() (*istream_iterator<int>(cin))
  15. using namespace std;
  16.  
  17. const int MAXN = 1e6+5;
  18.  
  19. int n;
  20. vector<P> g[MAXN];
  21. bitset<MAXN> chk;
  22. bitset<MAXN> incycle;
  23. long sum_ans;
  24.  
  25. void fastscan(int& x){
  26.     char c = getchar();
  27.     while(isspace(c)){
  28.         c = getchar();
  29.     }
  30.     int out = 0;
  31.     while(isdigit(c)){
  32.         out = out*10 + c - 48;
  33.         c = getchar();
  34.     }
  35.     x = out;
  36. }
  37.  
  38. void read() {
  39.     fastscan(n);
  40.     for(int i = 1; i <= n; ++i) {
  41.         int a, b;
  42.         fastscan(a), fastscan(b);
  43.         g[a].emplace_back(i, b);
  44.         g[i].emplace_back(a, b);
  45.     }
  46. }
  47.  
  48. vector<P> in;
  49. int pr;
  50.  
  51. int dfs(int u, int p) {
  52.     if(chk[u]) {
  53.         in.emplace_back(u, 0);
  54.         incycle[u] = true;
  55.         pr = u;
  56.         return -1;
  57.     }
  58.     chk[u] = true;
  59.     bool havepar = false;
  60.     for(auto v:g[u]) {
  61.         if(!havepar && v.x == p) {
  62.             havepar = true;
  63.             continue;
  64.         }
  65.         int now = dfs(v.x, u);
  66.         if(now == -1) {
  67.             if(pr == u) {
  68.                 in[0].y = v.y;
  69.                 return 0;
  70.             }
  71.             in.emplace_back(u, v.y);
  72.             incycle[u] = true;
  73.             return -1;
  74.         }
  75.     }
  76. }
  77.  
  78. long dp[MAXN], mxnow;
  79.  
  80. long mic(int u, int p) {
  81.     chk[u] = true;
  82.     long mx1 = 0, mx2 = 0;
  83.     for(auto v:g[u]) {
  84.         if(incycle[v.x] || v.x == p) continue;
  85.         long now = mic(v.x, u) + v.y;
  86.         if(now > mx1) swap(mx1, now);
  87.         if(now > mx2) swap(mx2, now);
  88.     }
  89.     mxnow = max(mxnow, mx1 + mx2);
  90.     return mx1;
  91. }
  92.  
  93. long dpl[2];
  94. long dpll[MAXN], dprr[MAXN];
  95.  
  96. void solve(int st) {
  97.     mxnow = 0;
  98.     in.clear();
  99.     dfs(st, st);
  100.     for(auto x:in) dp[x.x] = mic(x.x, x.x);
  101.     long dist = 0ll, best = dp[in[0].x];
  102.     int sz = in.size();
  103.     dpll[0] = best, dpl[0] = 0;
  104.     for(int i = 1; i < sz; ++i) {
  105.         dist += in[i].y;
  106.         dpl[i&1] = max(dpl[(i-1)&1], dp[in[i].x] + dist + best);
  107.         dpll[i] = max(dpll[i-1], dp[in[i].x] + dist);
  108.         best = max(best, dp[in[i].x] - dist);
  109.     }
  110.     mxnow = max(mxnow, dpl[(sz-1)&1]);
  111.     dist = 0ll, best = dp[in.back().x];
  112.     dprr[sz-1] = best;
  113.     for(int i = sz-2; i >= 0; --i) {
  114.         dist += in[i+1].y;
  115.         dprr[i] = max(dprr[i+1], dp[in[i].x] + dist);
  116.         best = max(best, dp[in[i].x] - dist);
  117.     }
  118.     long memo = in[0].y;
  119.     for(int i = 0; i < sz-1; ++i)
  120.         mxnow = max(mxnow, dpll[i] + dprr[i+1] + memo);
  121.     sum_ans += mxnow;
  122. }
  123.  
  124. int main() {
  125.     // freopen("r", "r", stdin);
  126.     cin.sync_with_stdio(false);
  127.     read();
  128.     for(int i = 1; i <= n; ++i) if(!chk[i]) solve(i);
  129.     printf("%lld\n", sum_ans);
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement