1+ template <typename T>
2+ class DSU
3+ {
4+ public:
5+ int N;
6+ vector<T> rank, parent, size;
7+ DSU (int n)
8+ {
9+ N = n;
10+ rank.resize (n + 1 , 0 );
11+ size.resize (n + 1 , 1 );
12+ parent.resize (n + 1 );
13+
14+ for (T i = 0 ; i <= n; ++i)
15+ {
16+ parent[i] = i;
17+ }
18+ }
19+
20+ template <typename X>
21+ X findParent (X u)
22+ {
23+ if (u == parent[u])
24+ return u;
25+ return parent[u] = findParent (parent[u]);
26+ }
27+
28+ // Not be using unionByRank
29+ // but yes for future reference
30+ template <typename X>
31+ void unionByRank (X u, X v)
32+ {
33+ int nodeX = findParent (u);
34+ int nodeY = findParent (v);
35+
36+ if (nodeX == nodeY)
37+ return ;
38+
39+ if (rank[nodeX] < rank[nodeY])
40+ {
41+ parent[nodeX] = nodeY;
42+ }
43+ else if (rank[nodeY] < rank[nodeX])
44+ {
45+ parent[nodeY] = nodeX;
46+ }
47+ else
48+ {
49+ parent[nodeY] = nodeX;
50+ ++rank[nodeX];
51+ }
52+ }
53+
54+ void unionBySize (int u, int v)
55+ {
56+ int nodeX = findParent (u);
57+ int nodeY = findParent (v);
58+
59+ if (nodeX == nodeY)
60+ return ;
61+
62+ if (size[nodeX] < size[nodeY])
63+ {
64+ parent[nodeX] = nodeY;
65+ size[nodeY] += size[nodeX];
66+ }
67+ else
68+ {
69+ parent[nodeY] = nodeX;
70+ size[nodeX] += size[nodeY];
71+ }
72+ }
73+
74+ template <typename X>
75+ bool isSame (X u, X v)
76+ {
77+ return findParent (u) == findParent (v);
78+ }
79+ };
80+ // DSU<int> dsu(n);
81+
82+ // dsu.unionByRank(u, v);
83+ // dsu.unionBySize(u,v);
84+ // dsu.isSame(u, v) bool
85+
86+
87+ class Solution {
88+ public:
89+ int findCircleNum (vector<vector<int >>& isConnected) {
90+
91+ int n = isConnected.size ();
92+ int m = isConnected[0 ].size ();
93+ int provinces = 0 ;
94+
95+ DSU<int > dsu (n);
96+ for (int i = 0 ; i< n; ++i)
97+ {
98+ for (int j = 0 ; j<m; ++j)
99+ {
100+ if (isConnected[i][j])
101+ dsu.unionBySize (i,j);
102+ }
103+ }
104+
105+ for (int i = 0 ; i < n; ++i)
106+ {
107+ if (dsu.findParent (i) == i)
108+ ++provinces;
109+ }
110+
111+ return provinces;
112+ }
113+ };
0 commit comments