Leetcode 547.省份数量
有 n n n个城市,其中一些彼此相连,另一些没有相连。如果城市 a a a与城市 b b b直接相连,且城市 b b b与城市 c c c直接相连,那么城市 a a a与城市 c c c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n ∗ n n * n n∗n 的矩阵 i s C o n n e c t e d isConnected isConnected ,其中 i s C o n n e c t e d [ i ] [ j ] = 1 isConnected[i][j] = 1 isConnected[i][j]=1表示第 i i i个城市和第 j j j个城市直接相连,而 i s C o n n e c t e d [ i ] [ j ] = 0 isConnected[i][j] = 0 isConnected[i][j]=0表示二者不直接相连。
返回矩阵中 省份 的数量。
示例 1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
示例 2:
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
提示:
1
<
=
n
<
=
200
1 <= n <= 200
1<=n<=200
n
=
=
i
s
C
o
n
n
e
c
t
e
d
.
l
e
n
g
t
h
n == isConnected.length
n==isConnected.length
n
=
=
i
s
C
o
n
n
e
c
t
e
d
[
i
]
.
l
e
n
g
t
h
n == isConnected[i].length
n==isConnected[i].length
i
s
C
o
n
n
e
c
t
e
d
[
i
]
[
j
]
为
1
或
0
isConnected[i][j] 为 1 或 0
isConnected[i][j]为1或0
i
s
C
o
n
n
e
c
t
e
d
[
i
]
[
i
]
=
=
1
isConnected[i][i] == 1
isConnected[i][i]==1
i
s
C
o
n
n
e
c
t
e
d
[
i
]
[
j
]
=
=
i
s
C
o
n
n
e
c
t
e
d
[
j
]
isConnected[i][j] == isConnected[j]
isConnected[i][j]==isConnected[j]
队列模拟搜索:
遇到一个没有经过的节点就把它加入队列, a n s + 1 ans+1 ans+1
然后遍历这个节点里面我们没去过的所有节点,把它们都加入队列
最后 a n s ans ans就是连通分量个数.也就是省份个数
class Solution {
public:
int findCircleNum(vector <vector<int>> &isConnected) {
int M[210] = {0};
int ans = 0;
int n = isConnected.size();
queue<int> q;
for (int k = 0; k < n; k++) {
if (M[k] == 0) {
q.push(k);
ans++;
}
while (q.size()) {
int i = q.front();
q.pop();
if (M[i]) continue;
int m = isConnected[i].size();
M[i] = 1;
for (int j = 0; j < m; j++) {
if (isConnected[i][j] == 1 && M[j] == 0) {
q.push(j);
}
}
}
}
return ans;
}
};
并查集:
先遍历一遍数组,把所有相连的省份连接起来
最后再遍历一遍有多少个不相同的父节点就是有多少个连通分量
class Solution {
public:
int f[210];
int fa(int n) {
if (f[n] == n) return n;
return f[n] = fa(f[n]);
}
void connect(int x, int y) {
int fx = fa(x);
int fy = fa(y);
if (fx > fy) {
f[fy] = fx;
} else {
f[fx] = fy;
}
}
int findCircleNum(vector <vector<int>> &isConnected) {
int n = isConnected.size();
for (int i = 0; i <= n; i++) f[i] = i;
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j && isConnected[i][j]) {
connect(i, j);
}
}
}
int Is[210] = {0};
for (int i = 0; i < n; i++) {
if (Is[fa(i)] == 0) {
Is[fa(i)]++;
ans++;
}
}
return ans;
}
};