547. 省份数量
省流:一道最简单的图论题,可以用来快速复习一下 DFS 和 BFS 的板子。
547. 省份数量
DFS
void dfs(int** isConnected, int* visited, int n, int i) {
for (int j = 0; j < n; j ++ ) { // 遍历所有结点
if (!visited[j] && isConnected[i][j]) { // 如果还没有遍历过
visited[j] = true;
dfs(isConnected, visited, n, j); // 继续搜索这个结点
}
}
}
int findCircleNum(int** isConnected, int isConnectedSize, int* isConnectedColSize) {
int n = isConnectedSize;
int provinces = 0;
int visited[n];
memset(visited, 0, sizeof(visited));
for (int i = 0; i < n; i ++ ) {
if (!visited[i]) {
dfs(isConnected, visited, n, i);
provinces ++;
// dfs 会把这个结点连接的所有结点设置为visited[i] = true
}
}
return provinces;
}
- 遍历所有结点,对每个结点依次进行检查是否搜索过。
- 如果未被访问,用
dfs()函数将一整块连通分量打通设置已访问。每次都能激活一整块连通分量。此时provinces++,省份加一。
BFS
int findCircleNum(int** isConnected, int isConnectedSize, int* isConnectedColSize) {
int n = isConnectedSize;
int flag[n];
memset(flag, 0, sizeof(flag));
int provinces = 0;
int que[n * n];
int left = 0, right = 0;
for (int i = 0; i < n; i ++ ) {
if (!flag[i]) {
provinces ++;
que[right ++ ] = i;
while (left < right) {
int j = que[left ++ ];
flag[j] = true;
for (int k = 0; k < n; k ++ ) {
if (!flag[k] && isConnected[j][k]) {
que[right ++ ] = k;
}
}
}
}
}
return provinces;
}
和 DFS 的思路几乎一样,直接遍历所有的城市,对每个城市进行一次 BFS 遍历。每次 BFS 会打通一块连通分量。注意统一在出队的时候设置标记📌为已访问即可。

浙公网安备 33010602011771号