24/05/2018, 19:31

Bài toán tìm kiếm đường đi trên đồ thị

G = (V, U) là đơn đồ thị (có hướng hoặc vô hướng). V = {1,. ., n} là tập các đỉnh, U là tập cạnh (cung). Với s, t € V, tìm tất cả các đường đi từ s đến t. Các thuật toán tìm kiếm cơ bản : Thuật toán DFS : Tìm kiếm theo chiều sâu. Thuật ...

G = (V, U) là đơn đồ thị (có hướng hoặc vô hướng). V = {1,. ., n} là tập các đỉnh, U là tập cạnh (cung). Với s, t € V, tìm tất cả các đường đi từ s đến t.

Các thuật toán tìm kiếm cơ bản :

Thuật toán DFS : Tìm kiếm theo chiều sâu.

Thuật toán BFS : Tìm kiếm theo chiều rộng.

Ý tưởng

Thuật toán DFS tiến hành tìm kiếm trong đồ thị theo chiều sâu. Thuật toán thực hiện việc thăm tất cả các đỉnh có thể đạt được cho tới đỉnh t từ đỉnh s cho trước. Đỉnh được thăm càng muộn sẽ càng sớm được duyệt xong (cơ chế LIFO -Vào Sau Ra Trước). Nên thuật toán có thể tổ chức bằng một thủ tục đệ quy quay lui

Mô tả thuật toán

Input G = (V,U), s, t

Output Tất cả các đường đi từ s đến t (nếu có). DFS ( int s) ?

for ( u = 1; u <= n; u++)

{

if (chấp nhận được)

{

Ghi nhận nó;

if (u ≠ t) DFS(u);

else In đường đi;

bỏ việc ghi nhận;

}

}

Ý tưởng

Thuật toán BFS tiến hành tìm kiếm trên đồ thị theo chiều rộng. Thuật toán thực hiện việc thăm tất cả các đỉnh có thể đạt được cho tới đỉnh t từ đỉnh s cho trước theo từng mức kề. Đỉnh được thăm càng sớm thì sẽ càng sớm được duyệt xong (cơ chế FIFO - Vào Trước Ra Trước).

Mô tả thuật toán

Input G = (V,E), s, t € V;

Output

Đường đi từ s đến t.

Mô tả :

- . . .

Thuật toán có không quá n bước lặp; một trong hai trường hợp sau xảy ra :

- Nếu với mọi i, t ? Ai : không có đường đi từ s đến t;

- Ngược lại, t ? A(m) với m nào đó. Khi đó tồn tại đường đi từ s tới t, và đó là

một đường đi ngắn nhất từ s đến t.

Trong trường hợp này, ta xác định được các đỉnh trên đường đi bằng cách

quay ngược lại từ t đến các đỉnh trước t trong từng các tập trước cho đến khi gặp s.

Minh hoạ :

Cho đơn đồ thị có hướng :

0