Advertisement
Guest User

Untitled

a guest
May 24th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     vector<int> findRedundantConnection(vector<vector<int>>& edges) {
  4.         int N = 0;
  5.         for (const auto& edge : edges)
  6.             N = max({N, edge[0], edge[1]});
  7.        
  8.         UF uf(N);
  9.         for (const auto& edge : edges) {
  10.             if (uf.IsConnected(edge[0], edge[1])) return edge;
  11.             uf.Connect(edge[0], edge[1]);
  12.         }
  13.        
  14.         return {};
  15.     }
  16. private:
  17.    
  18.     class UF {
  19.     public:
  20.         UF(int N) {
  21.             data_ = vector<int>(N + 1, -1);
  22.         }
  23.        
  24.         void Connect(int v, int u) {
  25.             auto [p1, w1] = GetParentAndWeight(v);
  26.             auto [p2, w2] = GetParentAndWeight(u);
  27.            
  28.             if (w1 > w2) {
  29.                 data_[p2] = p1;
  30.                 data_[p1] += w2;
  31.             } else {
  32.                 data_[p1] = p2;
  33.                 data_[p2] += w1;
  34.             }
  35.         }
  36.        
  37.         bool IsConnected(int v, int u) {
  38.             return GetParentAndWeight(v).first == GetParentAndWeight(u).first;
  39.         }
  40.     private:
  41.         vector<int> data_;
  42.        
  43.         pair<int, int> GetParentAndWeight(int v) {
  44.             int p = data_[v];
  45.            
  46.             while (p > 0) {
  47.                 int pp = data_[p];
  48.                 if (pp > 0) data_[v] = pp;
  49.                 v = p;
  50.                 p = pp;
  51.             }
  52.            
  53.             return {v, p};
  54.         }
  55.     };
  56. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement