d) Cài đặt thuật toán
6.5.2. Xây dựng cây khung của đồ thị bằng thuật toán BFS
Để tìm một cây khung trên đồ thị vô hướng liên thông ta có thể sử dụng kỹ thuật tìm kiếm theo chiều rộng. Giả sử ta cần xây dựng một cây bao trùm xuất phát tại đỉnh u nào đó. Trong cả hai trường hợp, mỗi khi ta đến được đỉnh v tức (chuaxet[v] = False) từ đỉnh u thì cạnh (u,v) được kết nạp vào cây khung.
a) Biểu diễn thuật toán
Hình 5.15. Thuật toán Tree-BFS
Thuật toán Tree-BFS(u):
Begin
Bước 1 (Khởi tạo):
T = ; //tập cạnh cây khung ban đầu.
Queue = ; //thiết lập hàng đợi ban đầu;
Push(Queue, u); //đưa u vào hàng đợi;
chuaxet[u] = False;//bật trạng thái đã xét của đỉnh u
Bước 2 (Lặp):
while (Queue ) do { //lặp cho đến khi hàng đợi rỗng
s = Pop(Queue); //lấy s ra khỏi hàng đợi
for each tKe(s) do { //lặp trên danh sách Ke(s)
if (chuaxet[t] ) then { //nếu đỉnh t chuaxet
Push(Queue, t);// đưa t vào hàng đợi
T = T(s,t); //kết nạp (s,t) vào cây khung
chuaxet[t] = False; //ghi nhận t đã xét
endif ; endfor ; endwwhile ;
Bước 3 (Trả lại kết quả) :
if (| T | < n-1 ) <Đồ thị không liên thông> ; else <Ghi nhận tập cạnh T của cây khung" ;
NGUYỄN DUY PHƯƠNG 205
b) Độ phức tạp thuật toán
Độ phức tạp thuật toán Tree-BFS(u) đúng bằng độ phức tạp thuật toán BFS(u).
c) Kiểm nghiệm thuật toán
Bạn đọc tự tìm hiểu và kiểm nghiệm thuật toán trong các tài liệu tham khảo liên quan.
d) Cài đặt thuật toán
#include<iostream> #include <list> #include <fstream> #include <iomanip> #include <stack> using namespace std;
struct canh{ //biểu diễn một cạnh của đồ thị
int dau; //đỉnh đầu của cạnh
int cuoi; //đỉnh cuối của cạnh
};
class Graph{ //xây dựng lớp đồ thị
private:
int V; // số đỉnh của đồ thị
list<int> *adj; // con trỏ đến mảng các danh sách kề
bool *chuaxet; //mảng chưa xét
canh *T;//tập cạnh của cây khung
int sc; //số cạnh của cây khung
public:
Graph(int V); // constructor của lớp
void addEdge(int v, int w); // thêm một cạnh vào đồ thị void Tree_BFS(int u);//thuật toán Tree-BFS
void Tree_DFS(int u);//thuật toán Tree-DFS
};
Graph::Graph(int V){ //constructor của lớp
this->V = V;//thiết lập tập đỉnh
adj = new list<int>[V];//thiết lập V danh sách kề
T = new canh[V]; sc =1; //thiết lập số cạnh cây khung
chuaxet = new bool[V];//thiết lập giá trị mảng chưa xét
for(int u=0; u<V; u++) chuaxet[u]=true; }