力扣 leetcode 547. 省份数量

问题描述

n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n * n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

提示:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] 为 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

示例

示例 1:

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

解题思路

这题与力扣 leetcode 200. 岛屿数量中的解法相似,这次我们使用 BFS 来求解:

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        int res = 0;
        queue<int> q; // BFS 使用 queue 来记录当前遍历的状态
        vector<bool> visited(isConnected.size(), false);
        for(int i = 0; i < isConnected.size(); i++){
            if(!visited[i]){
                q.emplace(i);
                res++;
                while(!q.empty()){
                    int city = q.front();
                    q.pop();
                    for(int j = 0; j < isConnected.size(); j++){
                        if(!visited[j] && isConnected[city][j]){ // 判断省份j是否已经遍历过了
                            q.emplace(j);
                            visited[j] = true;
                        }
                    }
                }
            }
        }
        return res;
    }
};
posted @ 2022-12-04 17:21  greatestchen  阅读(25)  评论(0编辑  收藏  举报