DuongNhi99

UPGRANET (2) - VOI 11 (Nâng cấp mạng)

Nov 25th, 2020 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4.  
  5. const int N = 1e5 + 5;
  6.  
  7. struct edge {
  8.     int c, u, v;
  9. };
  10.  
  11. bool operator < (const edge &a, const edge &b) {
  12.     return a.c > b.c;
  13. }
  14.  
  15. struct dsu {
  16.     int *parent;
  17.  
  18.     dsu(int n): parent(new int[n+1]) {
  19.         iota(parent + 1, parent + n + 1, 1);
  20.     }
  21.  
  22.     int findd(int u) {
  23.         if(parent[u] != u)
  24.             parent[u] = findd(parent[u]);
  25.         return parent[u];
  26.     }
  27.  
  28.     void join(int u, int v) {
  29.         if(rand()&1) swap(u, v);
  30.         parent[findd(u)] = findd(v);
  31.     }
  32. };
  33.  
  34. namespace lca {
  35.     LL res = 0;
  36.     int n, parent[N], c[N];
  37.     bool color[N];
  38.     vector<int> queries[N];
  39.  
  40.     struct pack {
  41.         int c, v;
  42.     };
  43.     vector<pack> ke[N];
  44.  
  45.     struct queue_type {
  46.         int u, v;
  47.     };
  48.     vector<queue_type> queue[N];
  49.  
  50.     int find(int u) {
  51.         if(parent[u] != u) {
  52.             int tmp = parent[u];
  53.             parent[u] = find(parent[u]);
  54.             c[u] = min(c[u], c[tmp]);
  55.         }
  56.         return parent[u];
  57.     }
  58.  
  59.     void dfs(int u, int dad) {
  60.         parent[u] = u;
  61.         for(pack p : ke[u])
  62.                 if (p.v != dad) {
  63.                 dfs(p.v, u);
  64.                 parent[p.v] = u;
  65.                 c[p.v] = p.c;
  66.             }
  67.         color[u] = true;
  68.  
  69.         for(int v : queries[u])
  70.             if (color[v] == true)
  71.                 queue[find(v)].push_back({u, v});
  72.  
  73.         for(auto q : queue[u]) {
  74.             find(q.u), find(q.v);
  75.             res += min(c[q.u], c[q.v]);
  76.         }
  77.     }
  78.  
  79.     void solve() {
  80.         fill(c + 1, c + n + 1, 1e9);
  81.         dfs(1, 0);
  82.     }
  83. }
  84.  
  85. int main() {
  86.     ios::sync_with_stdio(false);
  87.     cin.tie(NULL);
  88.  
  89.     int n, m; cin >> n >> m;
  90.     vector<edge> edges(m);
  91.  
  92.     for(edge &e : edges)
  93.         cin >> e.u >> e.v >> e.c;
  94.  
  95.     sort(edges.begin(), edges.end());
  96.     dsu d(n);
  97.  
  98.     LL res = 0;
  99.     for(edge &e : edges)
  100.         if(d.findd(e.u) != d.findd(e.v)) {
  101.             d.join(e.u, e.v);
  102.             lca::ke[e.u].push_back({e.c, e.v});
  103.             lca::ke[e.v].push_back({e.c, e.u});
  104.         }
  105.         else {
  106.             res += e.c;
  107.             lca::queries[e.u].push_back(e.v);
  108.             lca::queries[e.v].push_back(e.u);
  109.         }
  110.  
  111.     lca::n = n;
  112.     lca::solve();
  113.     cout << lca::res - res;
  114.  
  115.     return 0;
  116. }
  117.  
Add Comment
Please, Sign In to add comment