Thuật toán BFS 0-1, đúng như tên gọi của nó, là một cải tiến của thuật toán BFS. Tuy không quá khó để cài đặt, BFS 0-1 lại có thể giúp ta tối ưu hiệu quả trong một số bài toán lập trình thi đấu nhất định.
Trước khi tìm hiểu thêm về thuật toán BFS 0-1, mời bạn đọc xem qua bài toán sau đây.
Cho ma trận có kích thước . Ta cần đi từ vị trí đến vị trí . Ta có thể di chuyển theo 4 hướng sang các ô kề cạnh. Gọi là toạ độ của ô hiện tại và là toạ độ của ô đi tới. Nếu kí tự tại ô giống kí tự tại ô thì bước di chuyển đó tốn chi phí là , ngược lại thì chi phí là .
Yêu cầu tìm chi phí nhỏ nhất để đi từ ô đến ô .
Với bài toán này, ta có thể xem mỗi ô là một đỉnh và mỗi bước đi là một cạnh trong đồ thị sau đó áp dụng thuật toán Dijkstra để tìm đường đi ngắn nhất.
Tuy nhiên, cách làm này không đem lại hiệu quả cao với độ phức tạp . Trong đó là số lượng đỉnh () và là số cạnh trong đồ thị.
Lúc này, do trọng số cạnh chỉ là hoặc , ta có thể dùng thuật toán BFS 0-1 để giải quyết bài toán trong .
Thuận toán BFS 0-1 có thể được phát triển qua việc quan sát thuật toán Dijkstra cổ điển. Để thuận tiện cho việc cài đặt ta xem xét một bài toán tương tự:
Cho đồ thị có đỉnh và cạnh. Mỗi cạnh chỉ có thể có trọng số hoặc . Tìm đường đi ngắn nhất từ một đỉnh cho trước đến các đỉnh còn lại.
Để tìm khoảng cách nhỏ nhất từ một đỉnh đến các đỉnh còn lại, ta sử dụng thuật toán Dijkstra kết hợp cải tiến hàng chờ ưu tiên như sau:
Ta có thể thấy được rằng ở mọi thời điểm, với mọi đỉnh và thuộc hàng chờ ưu tiên, . Do hàng chờ ưu tiên luôn lấy ra hết các giá trị rồi mới tới nên không thể tồn tại giá trị khi vẫn còn trong hàng chờ.
Qua đó, ta có thể không dùng đến hàng chờ ưu tiên mà vẫn có thể đảm bảo việc thăm các đỉnh theo thứ tự tăng dần như trong thuật toán Dijkstra. Cụ thể hơn, nếu cạnh đang xét có trọng số là 0, ta sẽ ưu tiên đưa đỉnh tới thành đỉnh được xét kế tiếp.
Trong cài đặt, ta sẽ sử dụng cấu trúc dữ liệu deque. Với những cạnh trọng số 0, ta đưa đỉnh tới vào đầu deque (đỉnh được xét tiếp theo). Ngược lại, với những cạnh trọng số 1, ta đưa đỉnh vào cuối deque. Bằng cách cài đặt này, ta sẽ bảo toàn được thứ tự xét của các đỉnh trong đồ thị.
Thuật toán BFS 0-1 sử dụng deque như ta vừa mô tả có thể được minh hoạ như sau:
Như đã đề cập ở trên, ta sử dụng cấu trúc dữ liệu deque để cài đặt thuật toán BFS 0-1
Vì mỗi đỉnh sẽ chỉ được duyệt qua một lần nên độ phức tạp của thuật toán BFS 0-1 cài đặt như trên là , nhanh hơn nhiều so với độ phức tạp của thuật toán Dijkstra khi đã cải tiến.