Advertisement
tien_noob

MST Include edge[i] - MST + LCA (609E - Codeforces)

Jun 3rd, 2021
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. //Make CSP great again
  2. #include <bits/stdc++.h>
  3. #define TASK "TESTCODE"
  4. using namespace std;
  5. const int N = 2e5;
  6. const long long oo = 1e18;
  7. bool InTree[N + 1];
  8. long long d[N + 1], M[N + 1][21], mst = 0;
  9. int n, m, parent[N + 1][21], logg[N + 1], depth[N + 1];
  10. struct TEdge
  11. {
  12.     int u, v;
  13.     long long w;
  14. };
  15. TEdge e[N + 1];
  16. using PEdge = TEdge *;
  17. PEdge p[N + 1];
  18. vector<int> Adj[N + 1];
  19. struct TPQItem
  20. {
  21.     int node;
  22.     long long dlab;
  23.     bool operator < (const TPQItem & other) const
  24.     {
  25.         return other.dlab < dlab;
  26.     }
  27.     bool Valid()
  28.     {
  29.         return d[node] == dlab;
  30.     }
  31. };
  32. priority_queue<TPQItem> PQ;
  33. void read()
  34. {
  35.    cin >> n >> m;
  36.    for (int i = 1; i <= m; ++ i)
  37.    {
  38.        cin >> e[i].u >> e[i].v >> e[i].w;
  39.        p[i] = &e[i];
  40.        Adj[e[i].v].push_back(i);
  41.        Adj[e[i].u].push_back(i);
  42.    }
  43.    logg[1] = 0;
  44.    for (int i = 2; i <= N; ++ i)
  45.    {
  46.        logg[i] = logg[i/2] + 1;
  47.    }
  48. }
  49. void Prim()
  50. {
  51.     fill(InTree + 1, InTree + n + 1, false);
  52.     fill(d + 1, d + n + 1, oo);
  53.     d[1] = 0;
  54.     parent[1][0] = 1;
  55.     PQ.push({1, 0LL});
  56.     while (!PQ.empty())
  57.     {
  58.         TPQItem r = PQ.top();
  59.         PQ.pop();
  60.         if (!r.Valid())
  61.         {
  62.             continue;
  63.         }
  64.         int u = r.node;
  65.         for (int k = 1; k <= logg[n]; ++ k)
  66.         {
  67.             parent[u][k] = parent[parent[u][k-1]][k-1];
  68.             M[u][k] = max(M[u][k-1], M[parent[u][k-1]][k - 1]);
  69.         }
  70.         InTree[u] = true;
  71.         mst += d[u];
  72.         for (int i : Adj[u])
  73.         {
  74.             int v = p[i]->u ^ p[i]->v ^ u;
  75.             if (!InTree[v] && d[v] > p[i]->w)
  76.             {
  77.                 d[v] = p[i]->w;
  78.                 PQ.push({v, d[v]});
  79.                 parent[v][0] = u;
  80.                 M[v][0] = d[v];
  81.                 depth[v] = depth[u] + 1;
  82.             }
  83.         }
  84.     }
  85. }
  86. long long MaxLCAEdge(int u, int v)
  87. {
  88.     long long ans = 0;
  89.     if (depth[u] < depth[v])
  90.     {
  91.         swap(u, v);
  92.     }
  93.     int k = depth[u] - depth[v];
  94.     for (int i = 0; i < logg[n]; ++ i)
  95.     {
  96.         if (k & (1 << i))
  97.         {
  98.             ans = max(ans, M[u][i]);
  99.             u = parent[u][i];
  100.         }
  101.     }
  102.     if (u == v)
  103.     {
  104.         return ans;
  105.     }
  106.     for (int i = logg[n] - 1; i >= 0; -- i)
  107.     {
  108.         if (parent[u][i] != parent[v][i])
  109.         {
  110.             ans = max({ans, M[u][i], M[v][i]});
  111.             u = parent[u][i];
  112.             v = parent[v][i];
  113.         }
  114.     }
  115.     return max({ans, M[u][0], M[v][0]});
  116. }
  117. void solve()
  118. {
  119.    Prim();
  120.    for (int i = 1; i <= m; ++ i)
  121.    {
  122.        cout << mst - MaxLCAEdge(p[i]->u, p[i]->v) + p[i]->w << '\n';
  123.    }
  124. }
  125. int main()
  126. {
  127.    ios_base::sync_with_stdio(false);
  128.    cin.tie(nullptr);
  129.    //freopen(TASK".INP", "r", stdin);
  130.    //freopen(TASK".OUT", "w", stdout);
  131.    int t = 1;
  132.    bool typetest = false;
  133.    if (typetest)
  134.    {
  135.       cin >> t;
  136.    }
  137.    for (int __ = 1; __ <= t; ++ __)
  138.    {
  139.       cerr << "Case " << __ << ":" << '\n';
  140.       read();
  141.       solve();
  142.    }
  143. }
  144.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement