Phương pháp duyệt theo chiều rộng (Breadth-First Search - BFS)

  • Thuật toán:
    • Khởi tạo hàng đợi rỗng
    • Thêm đỉnh nguồn vào , đặt là đã thăm
    • Lặp cho đến khi rỗng:
      • Lấy đỉnh khỏi
      • Thao tác với đỉnh
      • Thêm các đỉnh kề với mà chưa được thăm vào , đánh dấu các đỉnh là đã thăm
  • Độ phức tạp: , trong đó
    • Khởi tạo:
    • Khi làm việc với hàng đợi, ta đưa các đỉnh lần lượt vào và ra khỏi hàng đợi, nên thời gian là
    • Khi làm việc với danh sách kề để lấy đỉnh cho vào hàng đợi, ta duyệt qua tất cả các đỉnh, thời gian là
  • Cây BFS: là đồ thị con của có được khi thực hiện BFS
  • Việc thực hiện BFS sẽ thăm đỉnh với đường đi ngắn nhất về số cạnh

Phương pháp duyệt theo chiều sâu (Depth-First Search - DFS)

  • Thuật toán:
    • Đặt tất cả các đỉnh là chưa thăm
    • Từ đỉnh đầu tiên:
      • Đặt đỉnh hiện tại là đã thăm
      • Thao tác với đỉnh hiện tại
      • Duyệt DFS với tất cả các đỉnh kề với nó
  • Thời gian bắt đầu và kết thúc duyệt
    • Xét biến , bắt đầu bằng 0
    • Mỗi lần thăm một đỉnh , tăng lên 1, đặt
    • Khi đã thăm hết các đỉnh kề với , tăng lên 1, đặt
  • Bổ đề các khoảng cách lồng nhau: Trong quá trình duyệt DFS:
    • là đỉnh con của nếu đoạn nằm trong đoạn
    • là đỉnh tổ tiên của nếu đoạn chứa đoạn
    • Nếu hai đoạn trên rời nhau, ta gọi là hai đỉnh không có quan hệ họ hàng
  • Phân loại cạnh:
    • Cạnh cây là cạnh đi từ tổ tiên đến đỉnh con đầu tiên của nó
    • Cạnh tới là cạnh đi từ tổ tiên đến con cháu, khác cạnh cây
    • Cạnh ngược là cạnh đi từ con cháu đến tổ tiên
    • Cạnh vòng là cạnh kề với hai đỉnh không có quan hệ họ hàng

Ứng dụng của DFS và BFS

  • Kiểm tra tính liên thông:
    • Nếu ta duyệt DFS/BFS đến khi tất cả các đỉnh đều được thăm, mỗi lần một đỉnh được gọi DFS và BFS để bắt đầu duyệt, ta có một thành phần liên thông
  • Tìm đường đi
  • Phát hiện chu trình:
    • Đồ thị không có chu trình nếu và chỉ nếu việc duyệt DFS không phát hiện cạnh ngược
  • Xét tính liên thông mạnh:
    • Từ một đỉnh nào đó, duyệt DFS, nếu có đỉnh chưa được duyệt, đồ thị không liên thông
    • Đảo ngược hướng tất cả các cạnh trên đồ thị, lặp lại bước trên
    • Nếu qua hai bước đều không tìm thấy đỉnh chưa được duyệt, ta có đồ thị liên thông mạnh
  • Định hướng đồ thị:
    • Xét đồ thị vô hướng liên thông
    • Duyệt DFS trên , phân loại cạnh và chọn ra cạnh cây, cạnh tới và cạnh ngược, lập thành đồ thị con .
    • định hướng được nếu liên thông mạnh