02/10/2018, 15:08

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

Bài viết này là phần 4 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 4 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 sâu DFS là thuật toán tìm kiếm trên cây hoặc đồ thị. Thuật toán này khác với BFS ở chỗ BFS duyệt theo chiều rộng (những đỉnh gần đỉnh gốc sẽ được thăm trước), còn DFS duyệt theo chiều sâu (Xuất phát từ đỉnh gốc, từ đỉnh đó phát triển xa nhất có thể theo mỗi nhánh)

1. Ý tưởng và cài đặt thuật toán DFS

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

Tư tưởng thuật toán có thể trình bày như sau: Từ một đỉnh S ban đầu ta sẽ có các đỉnh kề là x, từ đỉnh x ta sẽ có các đỉnh kề là y, và nó cũng thuộc nhánh s-x-y… Chúng ta thăm các nhánh đó theo chiều sâu (thăm đến khi không còn đỉnh kề chưa duyệt). Điều đó gợi cho chúng ta viết một thủ tục đệ quy DFS(u) để mô tả việc duyệt từ đỉnh u sang đỉnh kề v chưa được thăm.

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

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

a. Mô hình giải thuật DFS

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

b. Đề bài ví dụ

Ví dụ: Viết chương trình ghi ra thứ tự duyệt DFS 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 DFS

c. Code thuật toán DFS

1. Code DFS C++ tổ chức ma trận kề

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

2. Code DFS Pascal tổ chức ma trận kề

d. Test ví dụ

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

Test 1:

InputOutput
7 7 11 2

1 3

1 5

2 4

2 6

3 7

5 6

1

2

4

6

5

3

7

Test 2:

InputOutput
7 7 41 2

1 3

1 5

2 4

2 6

3 7

5 6

4

2

1

3

7

5

6

2. Độ phức tạp DFS

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

3. Bài tập ứng dụng thuật toán DFS

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

Yêu cầu hiểu về thành phần liên thông
VBGRASS spoj – Bãi cỏ ngon nhất
BCLKCOUN spoj PTIT – Đếm số ao

MTNTRAI spoj THPTCBT – 21697. Nông Trại

BCISLAND PTIT spoj – Nước biển

ADS spoj – Quảng cáo

Yêu cầu có kiến thức về cầu – khớp

BCACM11E spoj PTIT – Phương án bắn pháo

0