1. Trang chủ
  2. » Thể loại khác

CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ

14 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 536,63 KB

Nội dung

DFS, BFS §3 CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ 3 1 BÀI TOÁN Cho đồ thị G = (V, E) u và v là hai đỉnh của G Một đường đi (path) độ dài l từ đỉnh u đến đỉnh v là dãy (u = x0, x1, , xl = v) thoả mãn (xi.

§3 CÁC THUẬT TỐN TÌM KIẾM TRÊN ĐỒ THỊ 3.1 BÀI TOÁN Cho đồ thị G = (V, E) u v hai đỉnh G Một đường (path) độ dài l từ đỉnh u đến đỉnh v dãy (u = x0, x1, …, xl = v) thoả mãn (xi, xi+1) ∈ E với ∀ i: (0 ≤ i < l) Đường nói cịn biểu diễn dãy cạnh: (u = x0, x1), (x1, x2), …, (xl-1, xl = v) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường có đỉnh đầu trùng với đỉnh cuối gọi chu trình (Circuit), đường khơng có cạnh qua lần gọi đường đơn, tương tự ta có khái niệm chu trình đơn Ví dụ: Xét đồ thị vơ hướng đồ thị có hướng Hình 55: Trên hai đồ thị, (1, 2, 3, 4) đường đơn độ dài từ đỉnh tới đỉnh (1, 6, 5, 4) đường khơng có cạnh (cung) nối từ đỉnh tới đỉnh Một toán quan trọng lý thuyết đồ thị toán duyệt tất đỉnh đến từ đỉnh xuất phát Vấn đề đưa tốn liệt kê mà u cầu khơng bỏ sót hay lặp lại đỉnh Chính mà ta phải xây dựng thuật tốn cho phép duyệt cách hệ thống đỉnh, thuật tốn gọi thuật tốn tìm kiếm đồ thị ta quan tâm đến hai thuật tốn nhất: thuật tốn tìm kiếm theo chiều sâu thuật tốn tìm kiếm theo chiều rộng với số ứng dụng chúng Lưu ý: Những cài đặt cho đơn đồ thị vơ hướng, muốn làm với đồ thị có hướng hay đa đồ thị sửa đổi nhiều Dữ liệu đồ thị nhập từ file văn GRAPH.INP Trong đó: Dịng chứa số đỉnh n (≤ 100), số cạnh m đồ thị, đỉnh xuất phát S, đỉnh kết thúc F cách dấu cách m dòng tiếp theo, dòng có dạng hai số nguyên dương u, v cách dấu cách, thể có cạnh nối đỉnh u đỉnh v đồ thị Kết ghi file văn PATH.OUT Danh sách đỉnh đến từ S Đường từ S tới F 3.2 THUẬT TỐN TÌM KIẾM THEO CHIỀU SÂU (DEPTH FIRST SEARCH) 3.2.1 Cài đặt đệ quy Tư tưởng thuật toán: Trước hết, đỉnh x kề với S tất nhiên đến từ S Với đỉnh x kề với S tất nhiên đỉnh y kề với x đến từ S… Điều gợi ý cho ta viết thủ tục đệ quy DFS(u) mô tả việc duyệt từ đỉnh u cách thơng báo thăm đỉnh u tiếp tục q trình duyệt DFS(v) với v đỉnh chưa thăm kề với u Để không đỉnh bị liệt kê tới hai lần, ta sử dụng kỹ thuật đánh dấu, lần thăm đỉnh, ta đánh dấu đỉnh lại để bước duyệt đệ quy không duyệt lại đỉnh Để lưu lại đường từ đỉnh xuất phát S, thủ tục DFS(u), trước gọi đệ quy DFS(v) với v đỉnh kề với u mà chưa đánh dấu, ta lưu lại vết đường từ u tới v cách đặt TRACE[v] := u, tức TRACE[v] lưu lại đỉnh liền trước v đường từ S tới v Khi trình tìm kiếm theo chiều sâu kết thúc, đường từ S tới F là: F ← p1 = Trace[F] ← p2 = Trace[p1] ←… ← S procedure DFS(u  V); {Mã giả) begin < Thông báo tới u >; < Đánh dấu u thăm (có thể tới từ S)>; < Xét đỉnh v kề với u mà chưa thăm, với đỉnh v >; begin Trace[v] := u; {Lưu vết đường đi, đỉnh mà từ tới v u} DFS(v); {Gọi đệ quy duyệt tương tự v} end; end; begin {Chương trình chính} < Nhập liệu: đồ thị, đỉnh xuất phát S, đỉnh đích F >; < Khởi tạo: Tất đỉnh chưa bị đánh dấu >; DFS(S); < Nếu F chưa bị đánh dấu khơng thể có đường từ S tới F >; < Nếu F bị đánh dấu truy theo vết để tìm đường từ S tới F>; end P_4_03_1.PAS * Thuật tốn tìm kiếm theo chiều sâu program Depth_First_Search_1; const InputFile = 'GRAPH.INP'; OutputFile = 'PATH.OUT'; max = 100; var a: array[1 max, max] of Boolean; {Ma trận kề đồ thị} Free: array[1 max] of Boolean; {Free[v] = True  v chưa thăm đến} Trace: array[1 max] of Integer; {Trace[v] = đỉnh liền trước v đường từ S tới v} n, S, F: Integer; fo: Text; procedure Enter; {Nhập liệu} var i, u, v, m: Integer; fi: Text; begin Assign(fi, InputFile); Reset(fi); FillChar(a, SizeOf(a), False); {Khởi tạo đồ thị chưa có cạnh nào} ReadLn(fi, n, m, S, F); {Đọc dòng số n, m, S F} for i := to m {Đọc m dòng tiếp danh sách cạnh} begin ReadLn(fi, u, v); a[u, v] := True; a[v, u] := True; end; Close(fi); end; procedure DFS(u: Integer); {Thuật tốn tìm kiếm theo chiều sâu đỉnh u} var v: Integer; begin Write(fo, u, ', '); {Thông báo tới u} Free[u] := False; {Đánh dấu u thăm} for v := to n if Free[v] and a[u, v] then {Với đỉnh v chưa thăm kề với u} begin Trace[v] := u; {Lưu vết đường đi: Đỉnh liền trước v đường từ S tới v u} DFS(v); {Tiếp tục tìm kiếm theo chiều sâu v} end; end; procedure Result; {In đường từ S tới F} begin WriteLn(fo); {Vào dòng thứ hai Output file} WriteLn(fo, 'Path from ', S, ' to ', F, ': '); if Free[F] then {Nếu F chưa đánh dấu thăm tức khơng có đường} WriteLn(fo,'not found') else {Truy vết đường đi, F} begin while F S begin Write(fo, F, '

Ngày đăng: 30/09/2022, 12:24

HÌNH ẢNH LIÊN QUAN

§3. CÁC THUẬT TỐN TÌM KIẾM TRÊN ĐỒ THỊ 3.1. BÀI TOÁN  - CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
3. CÁC THUẬT TỐN TÌM KIẾM TRÊN ĐỒ THỊ 3.1. BÀI TOÁN (Trang 1)
Ví dụ: Xét một đồ thị vơ hướng và một đồ thị có hướng trong Hình 55: - CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
d ụ: Xét một đồ thị vơ hướng và một đồ thị có hướng trong Hình 55: (Trang 1)
Mơ hình của giải thuật có thể viết như sau: Bước 1: Khởi tạo:  - CÁC THUẬT TOÁN TÌM KIẾM TRÊN ĐỒ THỊ
h ình của giải thuật có thể viết như sau: Bước 1: Khởi tạo: (Trang 8)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w