บทนำ
กราฟจะเป็นต้นไม้ (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