DuongNhi99

GIAOTHONG (DSU)

Dec 24th, 2020 (edited)
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int oo = 1e9 + 7;
  5. const int N = 1e6 + 5;
  6. typedef pair <int, int> ii;
  7.  
  8. struct edge {
  9.     int u, v, c;
  10. };
  11.  
  12. int n, m, ans;
  13. int parent[N + 5];
  14. vector <edge> e;
  15.  
  16. bool comp(const edge &a, const edge &b) {
  17.     return a.c < b.c;
  18. }
  19.  
  20. int get_parent(int u) {
  21.     if (u == parent[u]) return u;
  22.     return parent[u] = get_parent(parent[u]);
  23. }
  24.  
  25. bool join(int u, int v, int c) {
  26.     u = get_parent(u);
  27.     v = get_parent(v);
  28.    
  29.     if (u == v) return false;
  30.     parent[v] = u;
  31.     return true;
  32. }
  33.  
  34. int main(){
  35.     cin >> n >> m;
  36.    
  37.     for (int i = 1; i <= n; ++i)
  38.         parent[i] = i;
  39.        
  40.     for (int i = 1; i <= m; ++i) {
  41.         int u, v; cin >> u >> v;
  42.         join(u, v, 0);
  43.     }
  44.    
  45.     for (int i = 1; i <= n; ++i){
  46.         for (int j = 1; j <= n; ++j){
  47.             int c; cin >> c;
  48.             if (i > j)
  49.                 e.push_back({i, j, c});
  50.         }
  51.     }
  52.    
  53.     sort(e.begin(), e.end(), comp);
  54.    
  55.     n = e.size();
  56.     ans = 0;
  57.    
  58.     for (int i = 0; i < n; ++i)
  59.         if (join(e[i].u, e[i].v, e[i].c))
  60.             ans += e[i].c;
  61.            
  62.     cout << ans;
  63.      
  64.     return 0;
  65. }
Add Comment
Please, Sign In to add comment