Tìm kiếm theo chiều rộng trên đồ thị

Một phần của tài liệu một số bài toán tối ưu tổ hợp trên đồ thị (Trang 27 - 31)

2 Một số bài toán tối ưu tổ hợp trên đồ thị

2.2.2 Tìm kiếm theo chiều rộng trên đồ thị

Ý tưởng chính của thuật toán:

Để ý rằng trong thuật toán tìm kiếm theo chiều sâu đỉnh được thăm càng muộn sẽ càng sớm trở thành đã duyệt xong. Điều đó là hệ quả tất yếu của việc các đỉnh được thăm sẽ được kết nạp vào trong ngăn xếp (Stack). Tìm kiếm theo chiều rộng trên đồ thị, được xây dựng dựa trên cơ sở thay thế ngăn xếp (Stack) bởi hàng đợi (Queue). Với sự cải biên như vậy, đỉnh được thăm càng sớm sẽ trở thành đã duyệt xong (tức là càng sớm dời khỏi hàng đợi). Một đỉnh trở thành đã duyệt xong ngay sau khi ta xét xong tất cả các đỉnh kề (chưa được thăm) với nó.

Giả sử ta có một danh sách chứa những đỉnh đang "chờ" thăm. Tại mỗi bước, ta thăm một đỉnh đầu danh sách và cho những đỉnh chưa "xếp hàng" kề với nó xếp hàng thêm vào cuối danh sách. Chính vì nguyên tắc đó nên danh sách chứa những đỉnh đang chờ sẽ được tổ chức dưới dạng hàng đợi

(Queue). Khi đó thuật toán được thực hiện theo các bước sau.

Bước 1: Khởi tạo. Các đỉnh đều ở trạng thái chưa đánh dấu, ngoại trừ đỉnh xuất phát S là đã đánh dấu. Một hàng đợi(Queue), ban đầu chỉ có một phần tử là S. Hàng đợi dùng để chứa các đỉnh sẽ được duyệt theo thứ tự ưu tiên chiều rộng.

Bước 2: Lặp các bước sau đến khi hàng đợi rỗng. Lấy u khỏi hàng đợi, thông báo thăm u (bắt đầu việc duyệt đỉnh u). Xét tất cả những đỉnh v kề với u mà chưa được đánh dấu, với mỗi đỉnh v đó:

Đánh dấu v;

Ghi nhận vết đường đi từ u tới v(Có thể làm chung với việc đánh dấu);

Đẩy v vào hàng đợi (v sẽ chờ được duyệt tại những bước sau);

Bước 3: Truy vết tìm đường đi.

Thủ tục tìm kiếm theo chiều rộng xuất phát từ đỉnh v được biểu diễn bởi hàm BF S(v) (viết tắt của cụm từ Breadth-First Search).

Procedure BF S(v);

(*Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v; Các biến Chuaxet, Ke là biến toàn cục*)

begin QU EU E := φ; QU EU E ← v; (*Kết nạp v vào QUEUE*) Chuaxet[v] := f alse; while QU EU E 6= φ do begin p ←QU EU E; (*Lấy p từ QUEUE*) Thăm_đỉnh(p); for u ∈ Ke(p) do if Chuaxet[u] then begin QU EU E ← u; Chuaxet[u] := f alse; end; end; end;

Sử dụng hàm BFS ta có thể dễ dàng đi qua đồ thị như sau: Tất cả các đỉnh của đồ thị được đánh dấu chưa được thăm. Lấy đỉnh v bất kỳ làm đỉnh xuất phát, sử dụng BF S(v) để thăm các đỉnh còn lại. Nếu còn có đỉnh chưa được thăm, ta lại chọn một đỉnh bất kỳ trong số các đỉnh đó làm đỉnh xuất phát để đi thăm tiếp, cho tới khi tất cả các đỉnh của đồ thị đã được thăm.

Khi đó, tìm kiếm theo chiều rộng trên đồ thị được thực hiện nhờ thuật toán sau.

Hình 2.4:Thuật toán BFS sử dụng hàng đợi QUEUE.

Thuật toán mô tả tựa pascal.

Input: Đồ thị G = (V,E); Đỉnh xuất phát S Output: Danh sách các đỉnh sau khi duyệt

begin

(*Khởi tạo*)

for v ∈ V do Chuaxet[v] := true; for v ∈ V do

if Chuaxet[v] then BF S(v); end.

Độ phức tạp của thuật toán BFS.

Lập luận tương tự như trong thủ tục tìm kiếm theo chiều sâu, có thể chỉ ra được rằng lệnh gọi BF S(v) sẽ cho phép đến thăm tất cả các đỉnh thuộc cùng thành phần liên thông với đỉnh v, và mỗi đỉnh của đồ thị sẽ được thăm đúng một lần. Độ phức tạp tính toán của thuật toán làO(|E|+|V|). Quá trình tìm kiếm trên đồ thị bắt đầu từ một đỉnh có thể thăm tất cả các đỉnh còn lại, khi đó cách biểu diễn đồ thị có ảnh hưởng lớn tới chi phí về thời gian thực hiện thuật toán.

Trong trường hợp ta biểu diễn đồ thị bằng danh sách kề, cả hai thuật toán BFS và DFS đều có độ phức tạp tính toán là O(|V| + |E|). Đây là cách cài đặt tốt nhất.

Ví dụ 2.2.3. Xét đồ thị trong Hình 2.5. Thứ tự thăm đỉnh của đồ thị này theo thuật toán BFS được ghi trong ngoặc, đường đi là nét in đậm.

Thứ tự các đỉnh được thăm theo BFS là A →B → C → D →E → F →

Hình 2.5: Thuật toán BFS

Bài toán 2.2.4. Vận dụng thuật toán DFS và BFS. Một nhóm gồm n sinh viên đi thám hiểm, mỗi người được trang bị một máy liên lạc. Mỗi máy có một mã số là một chuỗi sáu chữ số. Máy A liên lạc trực tiếp với máy B nếu hai số cuối của máy A trùng với hai số đầu của máy B. Máy A liên lạc được với máy B nếu có dãy A = A1, . . . , An = B sao cho Ai liên lạc trực tiếp với Ai+1. Hãy cho biết với hai bạn bất kì X, Y trong nhóm có thể liên lạc được với nhau hay không?

Bài giải: Mỗi sinh viên được trang bị một máy liên lạc có một mã số cố định là chuỗi sáu chữ số. Khi đó, mỗi mã số liên lạc là một đỉnh của đồ thị. Máy A liên lạc trực tiếp với B thì có một cung đi từ A đến B. Khi đó tồn tại một đồ thị (G) gồm n đỉnh, có hướng biểu diễn sự liên lạc của các đối tượng trong nhóm. Cần xem máy X và máy Y trong nhóm có liên lạc được với nhau hay không?

Để trả lời câu hỏi đó ta thực hiện thuật toán BFS trên đồ thị(G)có hướng, bắt đầu từ đỉnh X cho đến khi thấy được đỉnh Y thì kết luận hai bạn X và Y có thể liên lạc được với nhau. Ngược lại kết luận X và Y không liên lạc được với nhau.

Ví dụ 2.2.5. Input: Nhóm gồm 9 sinh viên với 9 máy liên lạc được gắn mã số là mã số của 9 đỉnh đồ thị như sau.

A: 12 87 56 B: 56 43 23 C: 23 48 43 S: 56 21 23 D: 23 45 12 E: 43 16 12 H: 78 61 43 T: 43 89 65 F: 65 71 23

được minh họa bởi đồ thị hình 2.6.

Hình 2.6: Vận dụng thuật toán BFS.

Output: a) Máy A có liên lạc được với máy T không? b) Máy A có liên lạc được với máy H không?

Bài giải: Vận dụng thuật toán duyệt đồ thị BFS với đồ thị có hướng trên hình 2.6 đỉnh xuất phát là A, thứ tự duyệt các đỉnh là:A, B, S, C, D, E, T, F. a) Có đường đi từ A đến T. Máy A có liên lạc được với máy T.

b) Không có đường đi từ A đến H. Máy A không liên lạc được với máy H.

Một phần của tài liệu một số bài toán tối ưu tổ hợp trên đồ thị (Trang 27 - 31)

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

(67 trang)