1. 程式人生 > 其它 >323. 無向圖中連通分量的數目

323. 無向圖中連通分量的數目

323. 無向圖中連通分量的數目

你有一個包含 n 個節點的圖。給定一個整數 n 和一個數組 edges ,其中 edges[i] = [ai, bi] 表示圖中 ai 和 bi 之間有一條邊。

返回 圖中已連線分量的數目 。

 

示例 1:

輸入: n = 5, edges = [[0, 1], [1, 2], [3, 4]]
輸出: 2

示例 2:

輸入: n = 5, edges = [[0,1], [1,2], [2,3], [3,4]]
輸出:  1

 

提示:

  • 1 <= n <= 2000
  • 1 <= edges.length <= 5000
  • edges[i].length == 2
  • 0 <= ai <= bi < n
  • ai != bi
  • edges 中不會出現重複的邊
 1 class Solution {
 2 public:
 3     unordered_map<int, vector<int>> hashMap; // key->節點值,value->與該節點連通節點列表
 4     int countComponents(int n, vector<vector<int>>& edges) {
 5         // 1、構建無向連通圖
 6         for (auto &vec : edges) {
7 hashMap[vec[0]].push_back(vec[1]); 8 hashMap[vec[1]].push_back(vec[0]); 9 } 10 // 2、設定訪問標記 11 vector<bool> visited(n, false); 12 // 3、廣度優先搜尋找到連通路徑數 13 int count = 0; 14 queue<int> q; 15 for (int i = 0; i < n; i++) {
16 if (visited[i]) { 17 continue; 18 } 19 q.push(i); 20 visited[i] = true; 21 count++; 22 while (!q.empty()) { 23 int tmp = q.front(); 24 q.pop(); 25 // 找到與tmp連通且未被訪問過的節點入隊 26 for (auto val : hashMap[tmp]) { 27 if (!visited[val]) { 28 q.push(val); 29 visited[val] = true; 30 } 31 } 32 } 33 } 34 return count; 35 } 36 };