Advertisement
ivnikkk

Untitled

Jan 12th, 2023
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. int n;
  6. vector<vector<pair<int, int>>> gr;
  7. vector<int> cycle, pred;
  8. vector<bool> used, cl;
  9. bool fnd = false;
  10. void find_cycle(int v, int p) {
  11.     if (fnd) { return; }
  12.     pred[v] = p;
  13.     used[v] = 1;
  14.     for (auto&& [u, w] : gr[v]) {
  15.         if (fnd) { return; }
  16.         if (used[u] && u != p) {
  17.             int st = v, end = u;
  18.             for (int it = st; it != end; it = pred[it]) {
  19.                 cycle.push_back(it);
  20.                 cl[it] = true;
  21.             }
  22.             cycle.push_back(end);
  23.             cl[end] = true;
  24.             fnd = true;
  25.             return;
  26.         }
  27.         else if (!used[u]) {
  28.             find_cycle(u, v);
  29.         }
  30.     }
  31. }
  32. vector<long long> dp;
  33. pair<long long, int> ver = { -1, -1 };
  34. void dfs(int v, int p, long long c) {
  35.     dp[v] = c;
  36.     if (c > ver.first) {
  37.         ver.first = c;
  38.         ver.second = v;
  39.     }
  40.     for (auto&& [u, w] : gr[v]) {
  41.         if (cl[u] || u == p) {
  42.             continue;
  43.         }
  44.         dfs(u, v, c + w);
  45.         dp[v] = max(dp[v], dp[u]);
  46.     }
  47. }
  48. void dfs2(int v, int p, long long c, int node) {
  49.     if (c > ver.first) {
  50.         ver.first = c;
  51.         ver.second = v;
  52.     }
  53.     for (auto&& [u, w] : gr[v]) {
  54.         if ((cl[u] && u != node) || u == p) {
  55.             continue;
  56.         }
  57.         dfs2(u, v, c + w, node);
  58.     }
  59. }
  60. struct comp {
  61.     int operator()(const pair<int, int>& p) const {
  62.         return p.first + p.second * 16063807ll;
  63.     }
  64. };
  65. signed main() {
  66. #ifdef _DEBUG
  67.     freopen("input.txt", "r", stdin);
  68.     freopen("output.txt", "w", stdout);
  69. #endif
  70.     ios_base::sync_with_stdio(false);
  71.     cin.tie(nullptr);
  72.     cin >> n;
  73.     int tp; cin >> tp;
  74.     gr.resize(n);
  75.     pred.resize(n, -1);
  76.     dp.resize(n, 0);
  77.     used.resize(n, false);
  78.     cl.resize(n, false);
  79.     unordered_map<pair<int, int>, int, comp> ed;
  80.     for (int i = 0; i < n; i++) {
  81.         int u, v; cin >> u >> v;
  82.         u--, v--;
  83.         int w; cin >> w;
  84.         ed[{u, v}] = w;
  85.         ed[{v, u}] = w;
  86.         gr[u].push_back({ v, w });
  87.         gr[v].push_back({ u, w });
  88.     }
  89.     long long best = 0;
  90.     find_cycle(0, -1);
  91.     for (int& i : cycle) {
  92.         ver = { -1, -1 };
  93.         dfs(i, i, 0);
  94.         if(ver.second == -1) { continue; }
  95.         dfs2(ver.second, ver.second, 0, i);
  96.         best = max(best, ver.first);
  97.     }
  98.     auto solve = [&] {
  99.         vector<long long> pref((int)cycle.size() + 1, 0);
  100.         vector<long long> suf((int)cycle.size() + 1, 0);
  101.         int rev = ed[{cycle[0], cycle.back()}];
  102.         for (int i = 1; i < (int)cycle.size(); i++) {
  103.             pref[i] = pref[i - 1] + ed[{cycle[i - 1], cycle[i]}];
  104.         }
  105.         for (int i = (int)cycle.size() - 2; i >= 0; i--) {
  106.             suf[i] = suf[i + 1] + ed[{cycle[i], cycle[i + 1]}];
  107.         }
  108.         multiset<long long> left, right;
  109.         vector<int> type((int)cycle.size(), 0);
  110.         int num = -1;
  111.         for (int i = 1; i < (int)cycle.size(); i++) {
  112.             if (pref[0] + suf[i] + rev <= pref[i]) {
  113.                 if (num == -1) {
  114.                     num = i;
  115.                 }
  116.                 left.insert(dp[cycle[i]] + pref[0] + suf[i] + rev);
  117.                 type[i] = 0;
  118.             }
  119.             else {
  120.                 right.insert(dp[cycle[i]] + pref[i]);
  121.                 type[i] = 1;
  122.             }
  123.         }
  124.         if (num == -1) {
  125.             if (!left.empty()) {
  126.                 best = max(best, *--left.end() + dp[cycle[0]]);
  127.             }
  128.             if (!right.empty()) {
  129.                 best = max(best, *--right.end() + dp[cycle[0]]);
  130.             }
  131.             return;
  132.         }
  133.         n = (int)cycle.size();
  134.         long long upd_left = 0, upd_right = -upd_left;
  135.         if (!left.empty()) {
  136.             best = max(best, *--left.end() + dp[cycle[0]]);
  137.         }
  138.         if (!right.empty()) {
  139.             best = max(best, *--right.end() + dp[cycle[0]]);
  140.         }
  141.         for (int i = 1; i < n; i++) {
  142.             upd_left += ed[{cycle[i - 1], cycle[i]}], upd_right = -upd_left;
  143.             if (!type[i]) {
  144.                 left.erase(left.find(dp[cycle[i]] + pref[0] + suf[i] + rev));
  145.             }
  146.             else {
  147.                 right.erase(right.find(dp[cycle[i]] + pref[i]));
  148.             }
  149.             while (num < n && pref[num % n] + upd_right <= suf[num % n] + pref[0] + rev + upd_left) {
  150.                 if (left.find(dp[cycle[num % n]] + suf[num % n] + pref[0] + rev) != left.end())left.erase(left.find(dp[cycle[num % n]] + suf[num % n] + pref[0] + rev));
  151.                 if (num > i) right.insert(dp[cycle[num % n]] + pref[num % n]);
  152.                 type[num % n] ^= 1;
  153.                 num++;
  154.             }
  155.             if (!left.empty()) {
  156.                 best = max(best, *--left.end() + upd_left + dp[cycle[i]]);
  157.             }
  158.             if (!right.empty()) {
  159.                 best = max(best, *--right.end() + upd_right + dp[cycle[i]]);
  160.             }
  161.         }
  162.     };
  163.     solve();
  164.     rotate(cycle.begin(), cycle.begin() + 1, cycle.end());
  165.     solve();
  166.     cout << best;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement