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 会打通一块连通分量。注意统一在出队的时候设置标记📌为已访问即可。

posted @ 2026-05-16 00:44  syn_tax  阅读(4)  评论(0)    收藏  举报