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

โปรแกรม C++ ตรวจสอบกราฟไม่มีทิศทางเป็นต้นไม้ (Tree) ด้วย DFS

บทนำ

กราฟจะเป็นต้นไม้ (Tree) ถ้าไม่มีวงจร (Cycle) นี่คือโปรแกรม C++ ตรวจสอบว่ากราฟไม่มีทิศทางเป็นต้นไม้หรือไม่

อัลกอริทึม

Begin function cyclicUtil():
  A) ทำเครื่องหมายโหนดปัจจุบันว่าเยี่ยมชมแล้ว
  B) เรียกซ้ำสำหรับทุกโหนดที่ติดกับโหนดนี้
  C) ถ้าโหนดติดกันยังไม่ถูกเยี่ยมชม ให้เรียกซ้ำสำหรับโหนดนั้น
  D) ถ้าโหนดติดกันถูกเยี่ยมชมแล้วและไม่ใช่ parent ของโหนดปัจจุบัน แสดงว่ามีวงจร
End

Begin function cyclic():
  A) ทำเครื่องหมายทุกโหนดว่าไม่ได้เยี่ยมชมและไม่อยู่ใน recursion stack
  B) เรียกฟังก์ชัน cyclicUtil() แบบเรียกซ้ำเพื่อตรวจจับวงจรในต้นไม้ DFS ต่างๆ
End

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

#include <iostream>
#include <list>
#include <limits.h>
using namespace std;

class Graph {
    int V;
    list<int> *adj;
    bool CyclicUtil(int v, bool visited[], int parent);
public:
    Graph(int V);
    void addEdge(int v, int w);
    bool cyclic();
};

Graph::Graph(int V) {
    this->V = V;
    adj = new list<int>[V];
}

void Graph::addEdge(int v, int u) {
    adj[v].push_back(u);
    adj[u].push_back(v);
}

bool Graph::CyclicUtil(int v, bool visited[], int parent) {
    visited[v] = true;
    list<int>::iterator i;
    for (i = adj[v].begin(); i != adj[v].end(); ++i) {
        if (!visited[*i]) {
            if (CyclicUtil(*i, visited, v))
                return true;
        } else if (*i != parent)
            return true;
    }
    return false;
}

bool Graph::cyclic() {
    bool *visited = new bool[V];
    for (int i = 0; i < V; i++)
        visited[i] = false;
    for (int u = 0; u < V; u++)
        if (!visited[u])
            if (CyclicUtil(u, visited, -1))
                return true;
    return false;
}

int main() {
    Graph g1(4);
    g1.addEdge(0, 1);
    g1.addEdge(1, 2);
    g1.cyclic() ? cout << "Undirected Graph isn't a tree\n" : cout << "Undirected Graph is a tree\n";
    return 0;
}

ผลลัพธ์

Undirected Graph is a tree