Một đồ thị là một cây nếu nó không chứa bất kỳ chu trình nào. Đây là một chương trình C ++ để kiểm tra xem một đồ thị vô hướng có phải là cây hay không.
Thuật toán
Begin Chức năng cyclicUtil ():A) Đánh dấu nút hiện tại là đã truy cập. B) Tuần hoàn đối với tất cả các đỉnh kề với đỉnh này. C) Nếu một vùng lân cận không được truy cập, thì lặp lại cho vùng lân cận đó. D) Nếu một lân cận được thăm và không phải là đỉnh hiện tại, thì sẽ có một chu trình. B) Gọi hàm đệ quy cyclicUtil () để phát hiện chu trình trong các câyDFS khác nhau.Ví dụ
#include#include #include
using namespace std; class G {int n; danh sách * adj; bool CyclicUtil (int v, bool visit [], int par); công khai:G (int n); // hàm tạo void addEd (int v, int w); bool cyclic ();}; G ::G (int n) {this-> n =n; adj =new list [n];} void G ::addEd (int v, int u) // để thêm các cạnh trong đồ thị {adj [v] .push_back (u); // thêm u vào danh sách của v. v, bool đã thăm [], int par) {đã thăm [v] =true; // Đánh dấu nút hiện tại là đã thăm // Định kỳ cho tất cả các đỉnh kề với danh sách đỉnh này ::iterator i; for (i =adj [v] .begin (); i! =adj [v] .end (); ++ i) {if (! đã thăm [* i]) // Nếu một vùng liền kề không được truy cập, thì lặp lại đối với {if (CyclicUtil (* i, visit, v)) liền kề đó trả về true; } // Nếu một lân cận được truy cập và không phải là đỉnh hiện tại, thì sẽ có một chu trình. else if (* i! =par) trả về true; } return false;} // để kiểm tra xem đồ thị có phải là dạng cây hay không.bool G ::cyclic () {bool * visit =new bool [n]; // Đánh dấu tất cả các đỉnh là không được thăm và không phải là một phần của ngăn xếp đệ quy for (int i =0; i Đầu ra
Đồ thị vô hướng là một cây