Advertisement
pasholnahuy

Дополнение

May 28th, 2023
1,024
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 1 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iomanip>
  6. #include <tuple>
  7. #include <map>
  8.  
  9. using namespace std;
  10.  
  11. class DSU {
  12. public:
  13.     vector<int> parent;
  14.     vector<int> height;
  15.  
  16.     DSU(int n) {
  17.         parent.resize(n);
  18.         for (int i = 0; i < n; ++i) {
  19.             parent[i] = i;
  20.         }
  21.         height.assign(n, 0);
  22.     }
  23.  
  24.     int findRoot(int v) {
  25.         if (v == parent[v]) {
  26.             return v;
  27.         }
  28.         int ans = findRoot(parent[v]);
  29.         parent[v] = ans;
  30.         return ans;
  31.     }
  32.  
  33.     void Union(int v1, int v2) {
  34.         if (height[v1] >= height[v2]) {
  35.             parent[v2] = v1;
  36.             height[v1] = max(height[v1], height[v2] + 1);
  37.         } else {
  38.             parent[v1] = v2;
  39.             height[v2] = max(height[v2], height[v1] + 1);
  40.         }
  41.     }
  42.  
  43.  
  44. };
  45.  
  46. int main() {
  47.     int n;
  48.     cin >> n;
  49.     vector<pair<double, pair<int, int>>> edges;
  50.     for (int i = 0; i < n; ++i) {
  51.         for (int j = 0; j < n; ++j) {
  52.             int t;
  53.             cin >> t;
  54.             edges.push_back({t, {i, j}});
  55.         }
  56.     }
  57.     DSU graph(n);
  58.     for (int i = 0; i < n; ++i) {
  59.         for (int j = 0; j < n; ++j) {
  60.             int t;
  61.             cin >> t;
  62.             if (t && graph.findRoot(i) != graph.findRoot(j)){
  63.                 graph.Union(i, j);
  64.             }
  65.         }
  66.  
  67.     }
  68.     sort(edges.begin(), edges.end());
  69.     double ans = 0;
  70.     for (auto [weight, coords]: edges) {
  71.         if (graph.findRoot(coords.first) != graph.findRoot(coords.second)) {
  72.             graph.Union(graph.findRoot(coords.first), graph.findRoot(coords.second));
  73.             ans += weight;
  74.         }
  75.     }
  76.     cout << ans;
  77.     return 0;
  78. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement