力扣 leetcode 547. 省份數量
阿新 • • 發佈:2022-12-04
問題描述
有 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; } };