Computer >> Máy Tính >  >> Lập trình >> C ++

Số lượng các thành phần được kết nối trong một đồ thị vô hướng trong C ++

Giả sử chúng ta có n nút và chúng được gắn nhãn từ 0 đến n - 1 và danh sách các cạnh vô hướng, cũng được đưa ra, chúng ta phải xác định một hàm để tìm số lượng các thành phần được kết nối trong một đồ thị vô hướng.

Vì vậy, nếu đầu vào là n =5 và các cạnh =[[0, 1], [1, 2], [3, 4]],

Số lượng các thành phần được kết nối trong một đồ thị vô hướng trong C ++

thì đầu ra sẽ là 2

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm dfs (), hàm này sẽ lấy nút, đồ thị, một mảng được gọi là đã thăm,

  • nếu [nút] đã truy cập là sai, thì -

    • đã truy cập [node]:=true

  • để khởi tạo i:=0, khi i

    • dfs (graph [node, i], graph, visit)

  • Từ phương thức chính, hãy làm như sau -

  • Xác định một mảng được truy cập có kích thước n

  • nếu không n là khác 0 thì -

    • Xác định đồ thị mảng [n]

  • để khởi tạo i:=0, khi i

    • u:=edge [i, 0]

    • v:=edge [i, 1]

    • chèn v vào cuối biểu đồ [u]

    • chèn u vào cuối biểu đồ [v]

  • ret:=0

  • để khởi tạo i:=0, khi i

    • nếu không được truy cập [i] là khác 0, thì -

      • dfs (i, biểu đồ, đã truy cập)

      • (tăng ret lên 1)

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   void dfs(int node, vector<int< graph[], vector<bool>& visited){
      if(visited[node]) return;
         visited[node] = true;
      for(int i = 0; i < graph[node].size(); i++){
         dfs(graph[node][i], graph, visited);
      }
   }
   int countComponents(int n, vector<vector<int<>& edges) {
      vector <bool> visited(n);
      if(!n) return 0;
         vector <int< graph[n];
      for(int i = 0; i < edges.size(); i++){
         int u = edges[i][0];
         int v = edges[i][1];
         graph[u].push_back(v);
         graph[v].push_back(u);
      }
      int ret = 0;
      for(int i = 0; i < n; i++){
         if(!visited[i]){
            dfs(i, graph, visited);
            ret++;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<vector<int<> v = {{0,1},{1,2},{3,4}};
   cout << (ob.countComponents(5, v));
}

Đầu vào

5, [[0,1],[1,2],[3,4]]

Đầu ra

2