Xây dựng cây khung của đồ thị bằng thuật toán BFS

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 80 - 82)

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 tKe(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; }

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2016): Phần 2 (Trang 80 - 82)

Tải bản đầy đủ (PDF)

(101 trang)