CHƯƠNG 1. CƠ SỞ LÝ THUYẾT VỀ ĐỒ THỊ VÀ ĐỘ PHỨC TẠP THUẬT TOÁN
1.3 MỘT SỐ THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
1.3.1 Thuật toán tìm kiếm theo chiều sâu (DEPTH FIRST SEARCH) a. Ý tưởng
Tư tưởng của thuật toán có thể trình bày như sau: Trước hết, mọi đỉnh x kề với S tất nhiên sẽ đến đƣợc từ S. Với mỗi đỉnh x kề với S đ thì tất nhiên những đỉnh y kề với x cũng đến đƣợc từ S...Điều đ gợi ý cho ta viết một thủ tục đệ quy DFS(u) mô tả việc duyệt từ đỉnh u bằng cách thông báo th m đỉnh u và tiếp tục quá trình duyệt DFS(v) với v là một đỉnh chƣa th m kề với u.
- Để không một đỉnh nào bị liệt kê tới hai lần, ta sử dụng kỹ thuật đánh dấu, mỗi lần th m một đỉnh, ta đánh dấu đỉnh đ l i để các bước duyệt đệ quy kế tiếp không duyệt l i đỉnh đ nữa.
- Để lưu l i đường đi từ đỉnh xuất phát S, trong thủ tục DFS(u), trước khi gọi đệ quy DFS(v) với v là một đỉnh kề với u mà chƣa đánh dấu, ta lưu l i vết đường đi từ u tới v bằng cách đặt TRACE[v] := u, tức là TRACE[v] lưu l i đỉnh liền trước v trong đường đi từ S tới v. Khi quá trình tìm kiếm theo chiều sâu kết thúc, đường đi từ S tới F sẽ là:
F ← p1 = Trace[F] ← p2 = Trace[p1] ←... ← S.
b. Mô tả thuật toán procedure DFS(uV);
begin
< 1. Thông báo tới đƣợc u >;
< 2. Đánh dấu u là đã th m (c thể tới đƣợc từ S)>;
< 3. Xét mọi đỉnh v kề với u mà chƣa th m, với mỗi đỉnh v đ >;
begin
Trace[v] := u; {Lưu vết đường đi, đỉnh mà từ đ tới v là u}
DFS(v); {Gọi đệ quy duyệt tương tự đối với v}
end;
end;
begin {Chương trình chính}
< Nhập dữ liệu: đồ thị, đỉnh xuất phát S, đỉnh đích F >;
< Khởi t o: Tất cả các đỉnh đều chƣa bị đánh dấu >;
DFS(S);
< Nếu F chưa bị đánh dấu thì không thể c đường đi từ S tới F >;
< Nếu F đã bị đánh dấu thì truy theo vết để tìm đường đi từ S tới F >;
end.
Ví dụ: Với đồ thị sau đây, đỉnh xuất phát S = 1: quá trình duyệt đệ quy có thể vẽ trên cây tìm kiếm DFS sau (Mũi tên u→v chỉ thao tác đệ quy: DFS(u) gọi DFS(v)).
Hìn : Qu trìn tìm k ếm t eo c ều sâu
1
2 4
6
3 5
7
1 2 4 6
3 5 7 8
8
1 9
1
2 4
6
3 5
7
1
2 4 6
3 5 7 8
8
1 9
1st
3rd
6th
4th
2nd 5th
1.3.2 Thuật toán tìm kiếm theo chiều rộng (BREADTH FIRST SEARCH) Cơ sở của phương pháp cài đặt này là "lập lịch" duyệt các đỉnh. Việc th m một đỉnh sẽ lên lịch duyệt các đỉnh kề nó sao cho thứ tự duyệt là ƣu tiên chiều rộng (đỉnh nào gần S hơn sẽ được duyệt trước). Ví dụ: Bắt đầu ta th m đỉnh S. Việc th m đỉnh S sẽ phát sinh thứ tự duyệt những đỉnh (x1, x2, ..., xp) kề với S (những đỉnh gần S nhất). Khi th m đỉnh x1 sẽ l i phát sinh yêu cầu duyệt những đỉnh (u1, u2 ..., uq) kề với x1. Nhƣng rõ ràng các đỉnh u này
"xa" S hơn những đỉnh x nên chúng chỉ đƣợc duyệt khi tất cả những đỉnh x đã duyệt xong. Tức là thứ tự duyệt đỉnh sau khi đã th m x1 sẽ là: (x2, x3..., xp, u1, u2, ..., uq).
Hình 13: Cây BFS
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)
Ta sẽ dựng giải thuật nhƣ sau:
X1 X2 Xp
U1 U2 Up
S
…
…
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 đ :
1. Đánh dấu v.
2. Ghi nhận vết đường đi từ u tới v (C thể làm chung với việc đánh dấu)
3. Đẩ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.
Ví dụ: Xét đồ thị dưới đây, Đỉnh xuất phát S = 1.
1
2 4
6
3 5
7
1 2 4 6
3 5
7
8
8
1 9
Hàng đợi Đỉnh u (lấy ra từ hàng đợi)
Hàng đợi (sau khi lấy u ra)
Các đỉnh v kề u mà chƣa lên lịch
Hàng đợi sau khi đẩy những đỉnh v vào
(1) 1 ∅ 2, 3 (2, 3)
(2, 3) 2 (3) 4 (3, 4)
(3, 4) 3 (4) 5 (4, 5)
(4, 5) 4 (5) 6 (5, 6)
(5, 6) 5 (6) Không có (6)
(6) 6 ∅ Không có ∅
Hình 14: Qu trìn tìm k ếm t eo c ều rộn
Để thứ tự các phần tử lấy ra khỏi hàng đợi, ta thấy trước hết là 1; sau đ đến 2, 3; rồi mới tới 4, 5; cuối c ng là 6. Rõ ràng là đỉnh gần S hơn sẽ đƣợc duyệt trước. Và như vậy, ta c nhận xét: nếu kết hợp lưu vết tìm đường đi thì đường đi từ S tới F sẽ là đường đi ngắn nhất (theo ngh a qua ít c nh nhất)
CHƯƠNG 2