Ứng dụng của đồ thị – Đồ thị liên thông

Input
2
4
0 1 1 1 
1 0 1 1 
1 1 0 1 
1 1 1 0 
7
0 1 0 0 0 0 0 
0 0 1 1 0 0 0 
1 0 0 0 0 0 0 
1 0 1 0 0 0 0 
0 0 0 0 0 1 1 
0 1 0 0 0 0 0 
0 0 0 1 0 1 0 
Output
Yes
No

Bài toán này yêu cầu kiểm tra xem một đồ thị có hướng có phải là đồ thị liên thông không. Để làm điều này, chúng ta có thể sử dụng thuật toán DFS hoặc BFS. Trong ví dụ này, tôi sử dụng DFS.

Để xác định xem đồ thị có phải là đồ thị liên thông mạnh (tức là mọi cặp đỉnh đều có thể đến được nhau), chúng ta cần thực hiện DFS bắt đầu từ mỗi đỉnh và kiểm tra xem có thể truy cập được đến mọi đỉnh khác không.

Hai phần quan trọng trong mã nguồn:

  • DFS: Hàm này thực hiện duyệt sâu từ một đỉnh đã chỉ định và đánh dấu các đỉnh đã truy cập được.

  • Kiểm tra liên thông: Hàm này kiểm tra xem từ mỗi đỉnh bắt đầu, có thể truy cập được đến mọi đỉnh khác không.

Mã nguồn đầy đủ:

#include <iostream>
using namespace std;
const int maxn = 1e3 + 10;
int graph[maxn][maxn]; // Ma trận kề
int visited[maxn]; // Mảng đánh dấu các đỉnh đã truy cập
int numVertices;
int testCases;

void dfs(int currentVertex, int numVertices) {
    visited[currentVertex] = 1; // Đánh dấu đỉnh hiện tại đã được truy cập
    for (int nextVertex = 0; nextVertex < numVertices; nextVertex++) {
        // Kiểm tra xem có một cạnh từ đỉnh hiện tại đến đỉnh tiếp theo và đỉnh tiếp theo chưa được truy cập
        if (graph[currentVertex][nextVertex] == 1 && visited[nextVertex] == 0) {
            dfs(nextVertex, numVertices); // Duyệt tiếp từ đỉnh tiếp theo
        }
    }
}

bool isStronglyConnected(int numVertices) {
    // Thực hiện DFS từ mỗi đỉnh và kiểm tra xem có thể truy cập được đến mọi đỉnh khác
    for (int startVertex = 0; startVertex < numVertices; startVertex++) {
        // Đặt lại mảng visited để bắt đầu từ đỉnh mới
        for (int i = 0; i < numVertices; i++) {
            visited[i] = 0;
        }
        dfs(startVertex, numVertices); // Bắt đầu DFS từ đỉnh startVertex
        // Kiểm tra xem có đỉnh nào không được truy cập không
        for (int i = 0; i < numVertices; i++) {
            if (visited[i] == 0) {
                return false; // Đồ thị không liên thông mạnh
            }
        }
    }
    return true; // Đồ thị là liên thông mạnh
}

int main() {
    cin >> testCases;
    while (testCases-- > 0) {
        cin >> numVertices;
        // Khởi tạo ma trận kề và mảng visited
        for (int i = 0; i < numVertices; i++) {
            visited[i] = 0;
            for (int j = 0; j < numVertices; j++) {
                graph[i][j] = 0;
            }
        }
        // Đọc ma trận kề
        for (int i = 0; i < numVertices; i++) {
            for (int j = 0; j < numVertices; j++) {
                cin >> graph[i][j];
            }
        }
        bool result = isStronglyConnected(numVertices); // Kiểm tra liên thông mạnh
        if (result) {
            cout << "Yes" << endl; // Đồ thị là liên thông mạnh
        } else {
            cout << "No" << endl; // Đồ thị không là liên thông mạnh
        }
    }
}

Thẻ: DFS BFS liên thông mạnh đồ thị có hướng cấp độ sâu

Đăng vào ngày 23 tháng 6 lúc 00:53