number-of-provinces-v2.cpp (1305B)
1 class Node { 2 public: 3 Node* parent = nullptr; 4 int size = 1; 5 }; 6 7 Node* find(Node& a){ 8 if(a.parent == nullptr) { 9 return &a; 10 } 11 auto found = find(*a.parent); 12 a.parent = found; 13 return found; 14 } 15 16 void union_nodes(Node& a, Node& b) { 17 auto p_a = find(a); 18 auto p_b = find(b); 19 if(p_a != p_b) { 20 if(p_a->size > p_b->size) { 21 p_b->parent = p_a; 22 p_a->size += p_b->size; 23 } else { 24 p_a->parent = p_b; 25 p_b->size += p_a->size; 26 } 27 } 28 } 29 30 class Solution { 31 public: 32 int findCircleNum(vector<vector<int>>& isConnected) { 33 34 unordered_map<int, Node*> provinces {}; 35 36 for(int i = 0; i < isConnected.size(); ++i) { 37 Node* node = new Node(); 38 provinces[i] = node; 39 } 40 41 for(auto pair: provinces) { 42 vector<int>& adj = isConnected[pair.first]; 43 for(int i = 0; i < adj.size(); ++i) { 44 if(adj[i]) { 45 union_nodes(*provinces[i], *pair.second); 46 } 47 } 48 } 49 50 unordered_set<Node*> reps {}; 51 52 for(auto pair: provinces) { 53 auto rep = find(*pair.second); 54 reps.insert(rep); 55 } 56 57 return reps.size(); 58 } 59 };