02/10/2018, 15:04

Bài 5: Thuật toán tìm kiếm theo chiều rộng BFS pascal c++

Bài viết này là phần 5 trong 7 bài của Series Lý thuyết đồ thị căn bản Lý thuyết đồ thị căn bản Bài 1: Ma trận kề C++/Pascal Lý thuyết đồ thị Bài 2: Danh sách cạnh C++ Lý thuyết đồ thị Bài 3: Danh sách kề C++ Lý thuyết đồ thị Bài 4: Thuật toán tìm kiếm theo chiều sâu DFS ...

Bài viết này là phần 5 trong 7 bài của Series Lý thuyết đồ thị căn bản

Lý thuyết đồ thị căn bản
  • Bài 1: Ma trận kề C++/Pascal Lý thuyết đồ thị
  • Bài 2: Danh sách cạnh C++ Lý thuyết đồ thị
  • Bài 3: Danh sách kề C++ Lý thuyết đồ thị
  • Bài 4: Thuật toán tìm kiếm theo chiều sâu DFS pascal c++
  • Bài 5: Thuật toán tìm kiếm theo chiều rộng BFS pascal c++
  • Bài 6: Thuật toán loang trên ma trận
  • Cấu trúc dữ liệu Disjoint Sets

Thuật toán tìm kiếm theo chiều rộng BFS là thuật toán tìm kiếm trong đồ thị bằng cách tìm kiếm dựa trên 2 thao tác chính là: cho trước một đỉnh của đồ thịthêm các đỉnh kề với nó vào danh sách chờ duyệt. Phương pháp cài đặt này là “lập lịch” để duyệt các đỉnh theo thứ tự duyệt ưu tiên trên chiều rộng (đỉnh nào gần với đỉnh gốc sẽ được duyệt trước)

Hình ảnh minh họa BFS, nguồn wikipedia

Vì nguyên tắc trên (đỉnh nào gần gốc sẽ được duyệt trước) nên thuật toán tìm kiếm theo chiều rộng BFS thường được dùng để tìm đường đi ngắn nhất giữa các đỉnh.

Chúng ta sẽ xây dựng một danh sách chứa các đỉnh đang chờ duyệt, tại mỗi bước chúng ta thăm đỉnh ở đầu danh sách và thêm những đỉnh kề với nó chưa có trong danh sách chờ vào cuối danh sách.

Vì nguyên tắc đó nên chúng ta có thể tổ chức danh sách chờ đó bằng cấu trúc dữ liệu hàng đợi (Queue).

Bạn có thể tham khảo thêm:

Bài 4: Thuật toán tìm kiếm theo chiều sâu DFS pascal c++

Quy ước như sau:

  • Push(x) là đẩy đỉnh x vào queue chờ
  • Pop() lấy một đỉnh từ hàng đợi
  • Empty() xác định queue còn đỉnh nào hay không?

– Chúng ta xây dựng bool Free[u] với ý nghĩa đỉnh u trong đồ thị chưa được duyệt đúng không?

– N là số đỉnh của đồ thị

1. Mô hình giải thuật BFS

Giải thuật BFS có thể viết theo mô hình dưới đây:

Ví dụ: Viết chương trình ghi ra thứ tự duyệt BFS xuất phát từ đỉnh s. Đồ thi gồm n đỉnh, m cạnh 2 chiều, các thành phần trên đồ thị liên thông với nhau.

Dữ liệu vào:

  • Dòng đầu: gồm 3 số nguyên n, m, s (1<=n, m<=100, 1<=s<=n)
  • M dòng tiếp theo: mỗi dòng gồm 2 số u, v, mô tả 1 cạnh trong đồ thị

Dữ liệu ra:

  • Gồm nhiều dòng, là thứ tự duyệt BFS

2. Code thuật toán tìm kiếm theo chiều rộng BFS

Tham khảo thêm về ma trận kề: https://kienthuc24h.com/ma-tran-ke-cpascal-ly-thuyet-thi/

a. Code thuật toán BFS C++

b. Code thuật toán tìm kiếm theo chiều rộng bfs trong pascal

c. Test ví dụ

Các bạn có thể thử các bộ test sau:

Test 1:

InputOutput
7 7 1

1 2

1 3

1 5

2 4

2 6

3 7

5 6

1

2

3

5

4

6

7

Test 2:

InputOutput
7 7 4

1 2

1 3

1 5

2 4

2 6

3 7

5 6

4

2

1

6

3

5

7

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

Độ phức tạp thời gian: O(|V|+|E|) với |V| là số đỉnh của đồ thị, |E| là số cạnh

Độ phức tạp dữ liệu: O(|V|)

4. Bài tập ứng dụng thuật toán BFS

Bạn có thể áp dụng ngay để làm các bài tập sau về BFS:

https://kienthuc24h.com/wecode-2015-problem-h-tim-duong-di-ngan-nhat/
https://kienthuc24h.com/upcoder-bfs-r2-b3-hereditament-hereditament/

Bài này yêu cầu bạn phải có kiến thức về thành phần liên thông:

https://kienthuc24h.com/bclkcoun-spoj-ptit-dem-so-ao/

https://kienthuc24h.com/bcdaisy-spoj-ptit-chu-bo-hu-hong/

https://kienthuc24h.com/bfs-spoj-ppath/

Và nhiều bài khác liên quan đến BFS bạn có thể tìm trên blog của mình.

Có thắc mắc gì các bạn vui lòng comment dưới đây, mình sẽ giải đáp.

0