LeetCode 547. 省份数量
有 n
个城市,其中一些彼此相连,另一些没有相连。如果城市 a
与城市 b
直接相连,且城市 b
与城市 c
直接相连,那么城市 a
与城市 c
间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n
的矩阵 isConnected
,其中 isConnected[i][j] = 1
表示第 i
个城市和第 j
个城市直接相连,而 isConnected[i][j] = 0
表示二者不直接相连。
返回矩阵中 省份 的数量。
示例 1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
method 1: DFS
void dfs(int cur, vector<vector<int>>& grid, vector<bool>& used) {
used[cur] = true;
for (int i = 0; i < grid.size(); i++) {
if (grid[cur][i] && !used[i]) {
dfs(i, grid, used);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<bool> used(n, false);
int cnt = 0;
for (int i = 0; i < n; i++) {
if (!used[i]) {
cnt++;
dfs(i, isConnected, used);
}
}
return cnt;
}
method 2: BFS
void bfs(int node, vector<vector<int>>& isConnected, vector<bool>& used) {
queue<int> q;
q.push(node);
while (!q.empty()) {
int x = q.front();
q.pop();
used[x] = true;
for (int i = 0; i < isConnected.size(); i++) {
if (isConnected[x][i] && !used[i]) {
q.push(i);
}
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<bool> used(n, false);
int cnt = 0;
for (int i = 0; i < n; i++) {
if (!used[i]) {
cnt++;
bfs(i, isConnected, used);
}
}
return cnt;
}
method 3: 并查集
int find(vector<int>& fa, int x) {
if (x != fa[x]) {
fa[x] = find(fa, fa[x]);
}
return fa[x];
}
void merge(vector<int>& fa, int i, int j) {
fa[find(fa, i)] = find(fa, j);
}
int findCircleNum(vector<vector<int>>& isConnected) {
int n = isConnected.size();
vector<int> fa(n);
for (int i = 0; i < n; i++) {
fa[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (isConnected[i][j]) {
merge(fa, i, j);
}
}
}
int cnt = 0;
for (int i = 0; i < n; i++) {
if (fa[i] == i) cnt++;
}
return cnt;
}