-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathSolution.cpp
76 lines (73 loc) · 1.74 KB
/
Solution.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* 113 / 113 test cases passed.
* Status: Accepted
* Runtime: 22 ms
*/
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
int len = M.size();
group = len;
for (int i = 0; i < len; i++) {
rank.push_back(1);
list.push_back(i);
}
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (M[i][j]) {
_union(i, j);
}
}
}
return group;
}
private:
vector<int> list;
vector<int> rank;
int group;
int find(int p) {
while (p != list[p]){
p = list[p] = list[list[p]];
}
return p;
}
void _union(int p, int q) {
int x = find(p);
int y = find(q);
if (x == y) return;
if (rank[x] < rank[y]) list[x] = y;
else {
list[y] = x;
if (rank[x] == rank[y]) rank[x]++;
}
group--;
}
};
/**
* 113 / 113 test cases passed.
* Status: Accepted
* Runtime: 12 ms
*/
class Solution2 {
public:
void dfs(vector<vector<int>> &isConnected, vector<bool> &used, int provinces, int i) {
for (int j = 0; j < provinces; ++ j) {
if (isConnected[i][j] && !used[j]) {
used[j] = true;
dfs(isConnected, used, provinces, j);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int ans = 0;
int provinces = isConnected.size();
vector<bool> used(provinces);
for (int i = 0; i < provinces; ++ i) {
if (!used[i]) {
dfs(isConnected, used, provinces, i);
++ ans;
}
}
return ans;
}
};