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

กราฟ Biconnected (Biconnected Graph)


บทนำ

กราฟไม่มีทิศทางเรียกว่า Biconnected ถ้าระหว่างโหนดใดๆ มีเส้นทางที่ไม่ร่วมโหนด (Vertex-disjoint paths) อย่างน้อย 2 เส้นทาง กล่าวคือ มี Cycle ระหว่างโหนดคู่นั้น

เงื่อนไข: 1) กราฟเชื่อมต่อ (Connected) 2) ไม่มี Articulation Point (Cut Vertex) - โหนดที่ถ้าลบจะทำให้กราฟขาดการเชื่อมต่อ

ใช้ DFS หา Articulation Point และตรวจสอบว่าเยี่ยมครบทุกโหนดหรือไม่

อินพุตและเอาต์พุต

Input: เมทริกซ์ติดกัน 5x5
Output: The Graph is a biconnected graph.

อัลกอริทึม

isArticulation(start, visited, disc, low, parent)

Input: โหนดเริ่มต้น, visited, disc (discovery time), low (low link), parent
Output: True ถ้าพบ Articulation Point

Begin
    time := 0 (static)
    dfsChild := 0
    mark start visited
    disc[start] := low[start] := ++time
    for โหนด v ใน G do
        if มีเส้นขอบ (start, v) then
            if v ไม่ visited then
                dfsChild++
                parent[v] := start
                if isArticulation(v, visited, disc, low, parent) return true
                low[start] := min(low[start], low[v])
                if parent[start] == -1 AND dfsChild > 1 return true  // Root มีลูก > 1
                if parent[start] != -1 AND low[v] >= disc[start] return true
            else if v != parent[start] then
                low[start] := min(low[start], disc[v])
    done
    return false
End

isBiconnected(graph)

Input: กราฟ
Output: True ถ้าเป็น Biconnected

Begin
    ตั้งค่า visited = false, parent = -1 สำหรับทุกโหนด
    if isArticulation(0, visited, disc, low, parent) return false
    for โหนด i ทุกตัว do if ไม่ visited return false done
    return true
End

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

#include<iostream>
#define NODE 5
using namespace std;

int graph[NODE][NODE] = {
    {0, 1, 1, 1, 0},
    {1, 0, 1, 0, 0},
    {1, 1, 0, 0, 0},
    {1, 0, 0, 0, 1},
    {0, 0, 0, 1, 0}
};

int min(int a, int b) { return (a 1) return true;
                if(parent[start] != -1 && low[v] >= disc[start]) return true;
            } else if(v != parent[start]) {
                low[start] = min(low[start], disc[v]);
            }
        }
    }
    return false;
}

bool isBiConnected() {
    bool *vis = new bool[NODE];
    int *disc = new int[NODE], *low = new int[NODE], *parent = new int[NODE];
    for(int i = 0; i

ผลลัพธ์

The Graph is a biconnected graph.