Skip to content

Commit da26146

Browse files
committed
Time: 20 ms (91.69%), Space: 13.8 MB (62.29%) - LeetHub
1 parent c34929d commit da26146

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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

Comments
 (0)