Advertisement
Guest User

Untitled

a guest
May 24th, 2019
113
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.         UF uf(edges.size());
  5.         for (const auto& edge : edges) {
  6.             if (uf.IsConnected(edge[0], edge[1])) return edge;
  7.             uf.Connect(edge[0], edge[1]);
  8.         }
  9.         return {};
  10.     }
  11. private:
  12.     class UF {
  13.     public:
  14.         UF(int N) {
  15.             data_ = vector<int>(N + 1, -1); // store weight of the subtree
  16.         }
  17.        
  18.         void Connect(int v, int u) {
  19.             auto p1 = GetParent(v);
  20.             auto w1 = data_[p1];
  21.            
  22.             auto p2 = GetParent(u);
  23.             auto w2 = data_[p2];
  24.            
  25.             if (w1 > w2) {
  26.                 data_[p2] = p1;  // connect smaller subtree to bigger one
  27.                 data_[p1] += w2; // add weights
  28.             } else {
  29.                 data_[p1] = p2;
  30.                 data_[p2] += w1;
  31.             }
  32.         }
  33.        
  34.         bool IsConnected(int v, int u) {
  35.             return GetParent(v) == GetParent(u);
  36.         }
  37.        
  38.     private:
  39.         vector<int> data_;
  40.        
  41.         int GetParent(int v) {
  42.             int p = data_[v];
  43.            
  44.             while (p > 0) {
  45.                 int pp = data_[p];
  46.                 if (pp > 0) data_[v] = pp; // path compression
  47.                 v = p;
  48.                 p = pp;
  49.             }
  50.            
  51.             return v;
  52.         }
  53.     };
  54. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement