Advertisement
Guest User

Untitled

a guest
Aug 4th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <assert.h>
  3. #include <unordered_map>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. typedef long double ld;
  8. typedef vector < long long > vll;
  9. typedef pair < long long, long long > pll;
  10. typedef pair < int, int > pii;
  11. typedef vector < int > vii;
  12.  
  13. #define csl ios_base::sync_with_stdio(false); cin.tie(NULL)
  14. #define l(x) (((x) << 1) | 1)
  15. #define r(x) ((l(x)) + 1)
  16. #define mp make_pair
  17. #define fst first
  18. #define snd second
  19.  
  20. ll t, n, u, v, m, q, r, ql, qr, k, l, s, x, y, w, c;
  21. const int N = 1e6 + 500;
  22. const long long mod = 1e9 + 7;
  23. const long long INF = 1LL << 57LL;
  24. const bool JUDGE = false;
  25. vii adj[N];
  26. bool vis[N], partcyc[N];
  27. int nxt[N];
  28. ll len[N], tl[N];
  29. ll ans = 0;
  30. ll ret = 0;
  31. inline void calc(int v, int p) {
  32.     tl[v] = 0;
  33.     //cout << v << '\n';
  34.     vis[v] = true;
  35.     ll besta = 0;
  36.     ll bestb = 0;
  37.     for (int i = 0; i < adj[v].size(); ++i) {
  38.         int u = adj[v][i];
  39.         if (u == p || partcyc[u]) continue;
  40.         calc(u, v);
  41.         tl[v] = max(tl[v], tl[u] + len[u]);
  42.         ll temp = tl[u] + len[u];
  43.         if (temp > besta) swap(besta, temp);
  44.         if (temp > bestb) bestb = temp;
  45.     }
  46.     ret = max(ret, besta + bestb);
  47. }
  48.  
  49. inline ll solve (int v) {
  50.     int start = -1;
  51.     while (!vis[v]) {
  52.         vis[v] = true;
  53.         v = nxt[v];
  54.     }
  55.     ret = 0;
  56.     start = v;
  57.     ll csum = len[v];
  58.     partcyc[v] = true;
  59.     v = nxt[v];
  60.     while (v != start) {
  61.         //cout << v << '\n';
  62.         csum += len[v];
  63.         partcyc[v] = true;
  64.         v = nxt[v];
  65.     }
  66.     //cout << start << ' ';
  67.     calc(v, - 1);
  68.     v = nxt[v];
  69.     while (v != start) {
  70.         calc(v, -1);
  71.         v = nxt[v];
  72.     }
  73.     ll x = tl[start];
  74.     ll y = tl[start] + csum - len[start];
  75.     v = start;
  76.     x += len[v];
  77.     v = nxt[v];
  78.     for (; v != start; v = nxt[v]) {
  79.         ret = max(ret, x + tl[v]);
  80.         ret = max(ret, y + tl[v]);
  81.         x = max(x, tl[v]);
  82.         y = max(y, tl[v] + csum);
  83.         x += len[v];
  84.         y -= len[v];
  85.     }
  86.     //cout << ret << '\n';
  87.     return ret;
  88. }
  89. int main(){
  90.     csl;
  91.     if (JUDGE) {
  92.         freopen("in.txt", "r", stdin);
  93.         freopen("out.txt", "w", stdout);
  94.     }
  95.     cin >> n;
  96.     for (int i = 1; i <= n; ++i) {
  97.         cin >> v >> c;
  98.         u = i;
  99.         nxt[i] = v;
  100.         len[i] = c;
  101.         adj[v].push_back(u);
  102.     }
  103.     for (int i = 1; i <= n; ++i) {
  104.         if (!vis[i]) ans += solve(i);
  105.     }
  106.     cout << ans << '\n';
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement