Trong Đồ thị vòng có hướng, chúng ta có thể sắp xếp các đỉnh theo thứ tự tuyến tính bằng cách sử dụng sắp xếp tôpô.
Sắp xếp tôpô chỉ hoạt động trên Đồ thị vòng có hướng. Trong Đồ thị Acyclic được Hướng dẫn (DAG), có thể có nhiều hơn một loại cấu trúc liên kết.
Trong chương trình C ++ sau đây, chúng ta sẽ thực hiện sắp xếp tôpô để kiểm tra sự tồn tại của một chu trình trong đồ thị.
Thuật toán
Đối với hàm Topo_Sort
Begin Xác định hàm Topo_Sort () Khai báo x với kiểu dữ liệu số nguyên, vstd [] của mảng Boolean và Stack dưới dạng ngăn xếp. Chuyển chúng dưới dạng tham số. Khởi tạo vstd [x] =true để đánh dấu nút hiện tại là vstd. Khai báo một trình lặp i. for (i =a [x] .begin (); i! =a [x] .end (); ++ i) if (! vstd [* i]) rồi gọi hàm Topo_Sort (* i, vstd, Stack) . Gọi hàm push () để chèn các giá trị vào ngăn xếp.Ví dụ
#include#include #include
using namespace std; class grph {// Lớp biểu diễn đồ thị int ver; danh sách * a; // Con trỏ tới một mảng chứa danh sách liền kềList void Topo_Sort (int x, bool vstd [], stack &Stack); // Một hàm được sử dụng bởi TopologicalSort public:grph (int ver); // Hàm tạo của grpf void Insert_Edge (int x, int y); // để chèn một cạnh vào đồ thị void Topol_Sort (); // in ra một Sắp xếp Tôpô của đồ thị hoàn chỉnh}; grph ::grph (int ver) {this-> ver =ver; a =new list [ver];} void grph ::Insert_Edge (int x, int y) {a [x] .push_back (y); // Thêm y vào danh sách của x.} // Một hàm đệ quy được sử dụng bởi Topol_Sortvoid grph ::Topo_Sort (int x, bool vstd [], stack &Stack) {vstd [x] =true; // Đánh dấu nút hiện tại là vstd. list ::iterator i; for (i =a [x] .begin (); i! =a [x] .end (); ++ i) if (! vstd [* i]) Topo_Sort (* i, vstd, Stack); // Đẩy đỉnh hiện tại vào ngăn xếp lưu trữ kết quả Stack.push (x);} void grph ::Topol_Sort () {stack Stack; // Đánh dấu tất cả các đỉnh không phải là vstd bool * vstd =new bool [ver]; for (int i =0; i Đầu ra
Topo Sắp xếp của biểu đồ là:5 4 2 3 1 0