Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ หา Transitive Closure ของกราฟ G

บทนำ

ถ้ามีกราฟมีทิศทาง ให้ตรวจสอบว่าโหนด j เข้าถึงได้จากโหนด i สำหรับทุกคู่ (i, j) ในกราฟ การเข้าถึงได้หมายถึงมีเส้นทางจาก i ไป j เมทริกซ์การเข้าถึงนี้เรียกว่า Transitive Closure ของกราฟ อัลกอริทึม Warshall มักใช้หา Transitive Closure นี่คือโปรแกรม C++ ที่นำอัลกอริทึมนี้ไปใช้

อัลกอริทึม

Begin
  1. รับจำนวนโหนดสูงสุด
  2. ตั้งชื่อโหนดเป็น a, b, c...
  3. ตรวจสอบว่ามีเส้นเชื่อมระหว่างโหนดด้วยลูป for:
     // ASCII ของ a คือ 97
     for i = 97 ถึง (97 + n_nodes) - 1
       for j = 97 ถึง (97 + n_nodes) - 1
         ถ้ามีเส้นเชื่อม adj[i-97][j-97] = 1
         ไม่มี adj[i-97][j-97] = 0
  4. พิมพ์ Transitive Closure:
     for i = 0 ถึง n_nodes-1
       c = 97 + i
     for i = 0 ถึง n_nodes-1
       c = 97 + i
       for j = 0 ถึง n_nodes-1
         พิมพ์ adj[i][j]
End

ตัวอย่างโค้ด C++

#include <iostream>
using namespace std;
const int n_nodes = 20;
int main() {
    int n_nodes, k, n;
    char i, j, res, c;
    int adj[10][10], path[10][10];
    cout << "\n\tMaximum number of nodes in the graph :";
    cin >> n;
    n_nodes = n;
    cout << "\nEnter 'y'for 'YES' and 'n' for 'NO' \n";
    for (i = 97; i < 97 + n_nodes; i++)
        for (j = 97; j < 97 + n_nodes; j++) {
            cout << "\n\tIs there an edge from " << i << " to " << j << " ? ";
            cin >> res;
            if (res == 'y')
                adj[i - 97][j - 97] = 1;
            else
                adj[i - 97][j - 97] = 0;
        }
    cout << "\nTransitive Closure of the Graph:\n";
    cout << "\n\t\t\t ";
    for (i = 0; i < n_nodes; i++) {
        c = 97 + i;
        cout << c << " ";
    }
    cout << "\n\n";
    for (int i = 0; i < n_nodes; i++) {
        c = 97 + i;
        cout << "\t\t\t" << c << " ";
        for (int j = 0; j < n_nodes; j++)
            cout << adj[i][j] << " ";
        cout << "\n";
    }
    return 0;
}

ผลลัพธ์

Maximum number of nodes in the graph :4
Enter 'y'for 'YES' and 'n' for 'NO'
Is there an edge from a to a ? y
Is there an edge from a to b ?y
Is there an edge from a to c ? n
Is there an edge from a to d ? n
Is there an edge from b to a ? y
Is there an edge from b to b ? n
Is there an edge from b to c ? y
Is there an edge from b to d ? n
Is there an edge from c to a ? y
Is there an edge from c to b ? n
Is there an edge from c to c ? n
Is there an edge from c to d ? n
Is there an edge from d to a ? y
Is there an edge from d to b ? n
Is there an edge from d to c ? y
Is there an edge from d to d ? n
Transitive Closure of the Graph:
a b c d
a 1 1 0 0
b 1 0 1 0
c 1 0 0 0
d 1 0 1 0