Ung Dung Duyet Do Thi

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 20

CHUYÊ N ĐỀ : DFS VÀ CÁ C Ứ NG DỤ NG

1. Giới thiệu
Trong chuyên đề nà y tô i trình bà y về phương phá p duyệt theo chiều sâ u (DFS) trên đồ thị
và cá c ứ ng dụ ng. Phầ n lý thuyết về cơ bả n đã rấ t rõ rà ng trong cuố n Tà i liệu giá o khoa chuyên Tin,
tô i trình bà y lạ i theo hướ ng tiếp cậ n củ a cá nhâ n, tà i liệu đượ c dù ng để dạ y cá c em họ c sinh lớ p
10 chuyên Tin, mớ i họ c đến phầ n lý thuyết cơ bả n về đồ thị.

Đố i vớ i họ c sinh lầ n đầ u tiên tiếp cậ n vớ i lý thuyết đồ thị sẽ khô ng trá nh khỏ i nhữ ng ngỡ
ngà ng, lạ lẫ m, có phầ n trừ u tượ ng khó hiểu, để giú p đỡ giả i quyết vấ n đề đó , trong phạ m vi
chuyên đề chỉ trình bà y nhữ ng ứ ng dụ ng cơ bả n củ a DFS và cá c bà i tậ p cho họ c sinh luyện tậ p, cá c
bà i tậ p đượ c sắ p xếp theo mứ c độ từ dễ tớ i khó , mỗ i bà i có hướ ng dẫ n sơ lượ c, có link test, mộ t số
bà i chỉ để link để bạ n đọ c tham khả o thêm.

Cá c bà i tậ p đượ c sưu tầ m chủ yếu nguồ n trên SPOJ và Uva để thuậ n tiện cho bạ n đọ c luyện
tậ p. Code mẫ u mộ t phầ n là củ a chính tá c giả , mộ t phầ n đượ c tham khả o trên Internet. Do hạ n chế
về thờ i gian cũ ng như trình độ , chuyên đề phả n á nh gó c tiếp cậ n củ a cá nhâ n trong quá trình dạ y
họ c phầ n DFS nên cò n có nhiều thiếu só t, rấ t mong nhậ n đượ c ý kiến đó ng gó p củ a bạ n đọ c để
hoà n thiện hơn. Xin châ n thà nh cả m ơn.

Nội dung chính


1. GIỚI THIỆU...................................................................................................................................................... 1

NỘI DUNG CHÍNH................................................................................................................................................ 1

2. TỔNG QUAN VỀ CÁC CÁCH BIỂU DIỄN ĐỒ THỊ VÀ PHÉP DUYỆT ĐỒ THỊ THEO CHIỀU SÂU (DFS).........................3

2.1. BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ VÀ DANH SÁCH KỀ...............................................................................................3


2.2. MÔ HÌNH DUYỆT DFS CƠ BẢN:................................................................................................................................4
Bài 1. Bài tập (SGK Chuyên Tin _Q1).............................................................................................................................4
Đề bài:........................................................................................................................................................................... 4
Thuật toán:................................................................................................................................................................... 4
Chương trình mẫu: (SGK Chuyên Tin – Q1 – Trang 144)...............................................................................................5
Nhận xét:...................................................................................................................................................................... 5
3. MỘT SỐ ỨNG DỤNG CỦA DFS....................................................................................................................................5
3.1. Duyệt qua tất cả các đỉnh thuộc đồ thị........................................................................................................5
Bài 2. Chú bò hư hỏng (BCDAISY)..................................................................................................................................5
Đề bài:........................................................................................................................................................................... 5
Thuật toán.................................................................................................................................................................... 6
Chương trình mẫu: http://ideone.com/tL8Wrz...........................................................................................................6
Test: http://www.spoj.com/PTIT/problems/BCDAISY/.................................................................................................6
Nhận xét....................................................................................................................................................................... 6
3.2. Tìm, đếm thành phần liên thông trên đồ thị vô hướng................................................................................6
Bài 3. Robin C11BC2......................................................................................................................................................6
Đề bài:........................................................................................................................................................................... 6
Thuật toán:................................................................................................................................................................... 7
Link đề và test: http://vn.spoj.com/problems/C11BC2/...............................................................................................7
Chương trình mẫu: http://ideone.com/YrAqX5...........................................................................................................7
Nhận xét:...................................................................................................................................................................... 7
3.3. Đánh số các thành phần liên thông (Floodfill)..............................................................................................8
Bài 4. Ốc sên ăn rau (OCSE)...........................................................................................................................................8
Đề bài............................................................................................................................................................................ 8
Thuật toán.................................................................................................................................................................... 9
Chương trình mẫu: http://ideone.com/O7BNKC..........................................................................................................9
Test: http://laptrinh.ntu.edu.vn/Problem/Details/51...................................................................................................9
Nhận xét....................................................................................................................................................................... 9
Bài 5. Đếm ao (BCLKCOUN)...........................................................................................................................................9
Đề bài............................................................................................................................................................................ 9
Thuật toán:................................................................................................................................................................. 10
Chương trình mẫu: http://ideone.com/8lD8xw...............................................................................................10
Test: http://www.spoj.com/PTIT/problems/BCLKCOUN/...........................................................................................10
Nhận xét..................................................................................................................................................................... 10
Bài 6. Bảo vệ nông trang (NKGUARD)..........................................................................................................................10
Đề bài:......................................................................................................................................................................... 10
Thuật toán.................................................................................................................................................................. 11
Chương trình mẫu: http://ideone.com/qfyDb5................................................................................................11
Test: http://vn.spoj.com/problems/NKGUARD/.........................................................................................................11
Nhận xét..................................................................................................................................................................... 11
Bài 7. (Tự giải) Trò chơi Lines (LINES)..........................................................................................................................11
Đề bài.......................................................................................................................................................................... 11
Test: http://laptrinh.ntu.edu.vn/Problem/Details/107..............................................................................12
Bài 8. Kết nối (CONNECT) – Trại hè HV 2015 – K11.....................................................................................................12
Đề bài.......................................................................................................................................................................... 12
Code mẫu.................................................................................................................................................................... 13
Bài 9. Bãi cỏ ngon nhất (VBGRASS).............................................................................................................................15
Đề bài: http://vn.spoj.com/problems/VBGRASS/.......................................................................................................15
Code mẫu: http://ideone.com/KJEqYQ..........................................................................................................15
Thuật toán: Dùng DFS đêm số lượng TPLT. Bài này cơ bản dễ....................................................................................15
Bài 10. NƯỚC BIỂN (BCISLAND)................................................................................................................................15
Đề bài:......................................................................................................................................................................... 15
Thuật toán:................................................................................................................................................................. 16
Code mẫu: http://ideone.com/3xsDwK..........................................................................................................16
Test: http://www.spoj.com/PTIT/problems/BCISLAND/............................................................................................16
Nhận xét:.................................................................................................................................................................... 16
Bài 11. Tính toán lượng nước (PBCWATER)..............................................................................................................16
Đề bài:......................................................................................................................................................................... 16
Thuật toán:................................................................................................................................................................. 17
Code mẫu: http://ideone.com/bHmvZP..........................................................................................................18
Test: http://vn.spoj.com/problems/PBCWATER/........................................................................................................18
Nhận xét: dạng khác của việc dùng DFS: loang theo lớp; đóng băng các vùng đã xử lý..............................................18
Bài 12. (Tham khảo) UVa 00260 - Il Gioco dell’X......................................................................................................18
Bài 13. (Tham khảo) UVa 00469 - Wetlands of Florida.............................................................................................18
Bài 14. (Tham khảo) UVa 00572 - Oil Deposits.........................................................................................................18
Bài 15. (Tham khảo) UVa 00785 - Grid Colouring.....................................................................................................18
3.4. Liệt kê khớp, cầu của đồ thị vô hướng.......................................................................................................18
Bài 16. Khớp và cầu cơ bản (GRAPH_)......................................................................................................................18
Đề bài.......................................................................................................................................................................... 18
Thuật toán: tìm khớp cầu cơ bản................................................................................................................................20
Code mẫu: http://ideone.com/gtnfCv..............................................................................................................20
Test: http://vn.spoj.com/problems/GRAPH_/............................................................................................................20
Nhận xét: tìm khớp cầu cơ bản...................................................................................................................................20
Bài 17. Điều kiện thời tiết (WEATHER).....................................................................................................................20
Đề bài + Test: http://vn.spoj.com/problems/WEATHER/............................................................................................20
Code mẫu: http://ideone.com/DeUfCw..........................................................................................................20
Bài 18. Thành phố trọng yếu (CRITICAL)...................................................................................................................20
Đề bài + Test: http://vn.spoj.com/problems/CRITICAL/..............................................................................................20
Code mẫu: http://ideone.com/CmciaP...........................................................................................................20
Bài 19. Phương án bắn pháo (BCACM11E)...............................................................................................................20
Đề bài + Test: http://www.spoj.com/PTIT/problems/BCACM11E/.............................................................................20
Code mẫu: http://ideone.com/Ge9ggu...........................................................................................................20
Bài 20. Mạng máy tính an toàn (SAFENET2).............................................................................................................20
Đề bài + Test: http://vn.spoj.com/problems/SAFENET2/............................................................................................20
Code mẫu: http://ideone.com/zOc7zp............................................................................................................20
Bài 21. (Tham khảo) UVa 00315 – Network..............................................................................................................20
Bài 22. (Tham khảo) UVa 00610 - Street Directions (finding bridges).......................................................................20
Bài 23. (Tham khảo) UVa 00796 - Critical Links * (finding bridges)...........................................................................20
Bài 24. (Tham khảo) UVa 10199 - Tourist Guide (finding articulation points)...........................................................20
Bài 25. (Tham khảo) UVa 10765 - Doves and Bombs * (finding articulation points).................................................20
3.5. Tìm thành phần liên thông mạnh trên đồ thị có hướng.............................................................................20
Bài 26. (Tham khảo) Tìm thành phần liên thông mạnh (TJALG)................................................................................20
Bài 27. (Tham khảo) Truyền tin (MESSAGE)..............................................................................................................20
Bài 28. (Tham khảo) Biến đổi số (NUMBER).............................................................................................................20
Bài 29. (Tham khảo) Cho kẹo hay bị phá nào (TREAT)..............................................................................................20
Bài 30. (Tham khảo) UVa 11838 - Come and Go (check if graph is strongly connected)...........................................21
Bài 31. (Tham khảo) UVa 00247 - Calling Circles * (SCC + printing solution)............................................................21
Bài 32. (Tham khảo) UVa 11709 - Trust Groups (find number of SCC)......................................................................21

2. Tổng quan về các cách biểu diễn đồ thị và phép duyệt đồ thị theo chiều sâu (DFS).

2.1. Biểu diễn đồ thị bằng ma trận kề và danh sách kề.


Yêu cầ u đố i vớ i việc tiếp cậ n chuyên đề nà y: họ c sinh đã nắ m đượ c mộ t số khá i niệm cơ
bả n về đồ thị (đỉnh, cạ nh, đồ thị có hướ ng, vô hướ ng, có trọ ng số , khô ng có trọ ng số , thà nh phầ n
liên thô ng, đườ ng đi,…) đồ ng thờ i biết cá ch biểu diễn đồ thị cơ bả n (Biểu diễn bằ ng ma trậ n kề/
ma trậ n trọ ng số , danh sá ch kề)

2.2. Mô hình duyệt DFS cơ bản:


Bài 1. Bài tập (SGK Chuyên Tin _Q1)

Đề bài:
Cho mộ t đồ thị có hướ ng G(V,E), N đỉnh, M cạ nh ((N ≤10 5 , M ≤106 ) cá c đỉnh đượ c đá nh số từ 1
tớ i n và đượ c đồ ng nhấ t vớ i số hiệu củ a chú ng. Khuô n dạ ng Input, Output đượ c quy định như sau:

Input:

o Dò ng 1: chứ a số đỉnh N, đỉnh xuấ t phá t S


o N dò ng tiếp theo, dò ng thứ i chứ a mộ t danh sá ch cá c đỉnh, mỗ i đỉnh j trong danh sá ch
tương ứ ng vớ i mộ t cung (i,j) củ a đồ thị, ngoà i ra cò n có thêm số 0 ở cuố i dò ng để bá o hiệu
kết thú c.

Ouput:

o Danh sá ch cá c đỉnh có thể đến đượ c từ s

Ví dụ:

Input Output
815 123456
230
340
150
60
0
20
80
0
Thuật toán:
Tiến hà nh duyệt DFS từ đỉnh S, trong quá trình duyệt, tạ i mỗ i đỉnh in ra số hiệu củ a đỉnh hiện tạ i.

Chương trình mẫu: (SGK Chuyên Tin – Q1 – Trang 144)

Nhận xét:
Bà i nà y hết sứ c cơ bả n, mụ c đích để cho Hs hiểu đượ c hoạ t độ ng củ a thủ tụ c DFS. Tiến hà nh thă m cá c đỉnh
đến đượ c từ mộ t đỉnh.

3. Một số ứng dụng của DFS

3.1. Duyệt qua tất cả các đỉnh thuộc đồ thị


Với thủ tục duyệt DFS như trên, muốn duyệt qua tất cả các đỉnh của đồ thị ta tiến hành như sau trong chương
trình chính:
Bài 2. Chú bò hư hỏng (BCDAISY)

Đề bài:
Nô ng dâ n John có N (1<=N<=250) con bò đá nh số từ 1..N chơi trên bã i cỏ . Để trá nh bị lạ c
mấ t cá c con bò , mỗ i con bò có thể đượ c nố i vớ i mộ t số con bò khá c bằ ng dâ y thừ ng. Có tấ t cả M (1
<= M <= N*(N-1)/2) dâ y thừ ng nố i cá c con bò . Tấ t nhiên, khô ng có 2 con bò mà có nhiều hơn 1
dâ y thừ ng nố i giữ a chú ng. Dữ liệu cho biết mỗ i cặ p con bò c1 và c2 là nố i vớ i nhau (1 <= c1 <= N;
1 <= c2 <= N; c1 != c2).

Nô ng dâ n John buộ c cố định con bò 1 bằ ng sợ i dâ y xích. Cá c con bò khá c phả i nố i vớ i con bò 1


bằ ng mộ t số sợ i dâ y thừ ng. Tuy nhiên, mộ t số con bò hư hỏ ng khô ng như vậ y. Hã y giú p nô ng dâ n
John tìm cá c con bò hư hỏ ng đó (khô ng kết nố i tớ i bò 1). Dĩ nhiên, con bò thứ 1 luô n nố i tớ i chính
nó .

Input:

Dò ng 1: 2 số nguyên cá ch nhau bở i dấ u cá ch: N và M

Dò ng 2 đến dò ng M+1: Dò ng i+1 cho biết 2 con bò nố i vớ i nhau bằ ng sợ i dâ y thứ i là c1 và c2 cá ch


nhau bở i dấ u cá ch.

Output:

Nếu khô ng có con bò hư hỏ ng, in ra 0. Ngượ c lạ i, in ra trên mỗ i dò ng 1 số nguyên là thứ tự con bò


hư hỏ ng theo thứ tự tă ng dầ n.

Ví dụ:

Input Output
64 4
13 5
23 6
12
45
Thuật toán
Dù ng DFS liệt kê cá c đỉnh khô ng thuộ c thà nh phầ n liên thô ng vớ i đỉnh có số hiệu 1

Chương trình mẫu: http://ideone.com/tL8Wrz

Test: http://www.spoj.com/PTIT/problems/BCDAISY/

Nhận xét
Mụ c đích củ a bà i nà y là giú p HS luyện cá ch nhậ n biết và sử dụ ng DFS. Bà i cơ bả n và rấ t dễ code.

3.2. Tìm, đếm thành phần liên thông trên đồ thị vô hướng
Vớ i thủ tụ c DFS như trên, để đếm số thà nh phầ n liên thô ng trên đồ thị vô hướ ng, ta duy trì biến
đếm DemTPLT để lưu số lượ ng TPLT, mỗ i lầ n gọ i thủ tụ c DFS ta sẽ tă ng DemTPLT
Bài 3. Robin C11BC2

Đề bài:
Mộ t ngà y đẹp trờ i nọ , trên vương quố c củ a cá c Coders 2011, bỗ ng xuấ t hiện 1 lã o phù thủ y
độ c á c, lã o phù thủ y sirDat_LS đã có â m mưu thô n tính đấ t nướ c củ a đứ c vua vodanh9x. Lã o phù
thủ y nà y rấ t yêu con gá i củ a đứ c vua là Rose và đã bắ t Rose về nơi ở củ a lã o ta. Đứ c vua vodanh9x
liền tìm hiệp sĩ Robin và sẽ hứ a gả con gá i cho Robin nếu chà ng cứ u đượ c cô ng chú a Rose trở về.
Lã o phù thủ y sirDat_LS độ c á c vớ i khuô n mặ t rấ t ghê tở m khiến cô ng chú a mỗ i khi nhìn thấ y hắ n
thì cô ng chú a lạ i ngấ t đi. Và rồ i, chà ng Robin củ a chú ng ta đã tìm đượ c đến nơi ở củ a lã o phù thủ y.
Nơi ở củ a lã o là 1 mê cung có N phò ng, và N phò ng nà y liên thô ng vớ i nhau và có đú ng N-1 đườ ng
đi (coi mỗ i đườ ng đi là 1 cạ nh). Nhưng khó khă n thay, lã o phù thủ y đã đá nh số mỗ i đườ ng đi là 1
hoặ c 2. Nếu chà ng Robin muố n đến cứ u cô ng chú a, thì từ nơi xuấ t phá t đến nơi có cô ng chú a phả i
có ít nhấ t mộ t đườ ng đi đượ c đá nh số 2, nếu khô ng chà ng Robin sẽ chết. Yêu cầ u: Cho m truy vấ n
(m <= 10^5) mỗ i truy vấ n có dạ ng (x,y), trong đó x là nơi xuấ t phá t củ a Robin và y là nơi nhố t
cô ng chú a. Xá c định đườ ng đi ngắ n nhấ t từ x đến y có cạ nh có trọ ng số 2 hay khô ng.

Input:

o Dò ng đầ u là số nguyên N (N <= 10^4) – số đỉnh củ a đồ thị và M – số truy vấ n.


o Từ dò ng 2 đến dò ng N: dò ng thứ i chứ a 2 số nguyên dương x (x < i) và k (k <= 2) nghĩa là
có cạ nh nố i giữ a i và x và đượ c đá nh số là k.
o M dò ng sau: mỗ i dò ng chứ a 2 số x và y (Biểu thị cho truy vấ n (x,y)).

Output: Vớ i mỗ i truy vấ n, xuấ t ra “YES” nếu tồ n tạ i đườ ng đi có ít nhấ t 1 cạ nh có trọ ng số 2,


ngượ c lạ i xuấ t ra “NO”.

Ví dụ:

Input Ouput
67 YES
11 YES
12 NO
31 NO
12 NO
52 YES
13 NO
51
21
21
12
24
12
Thuật toán:
– Chỉ đọ c cá c cạ nh 1 và o đồ thị, cò n cá c cạ nh 2 ta sẽ bỏ .

– Xâ y dự ng mả ng DD[i] là chỉ số vù ng liên thô ng củ a đỉnh i. Xâ y dự ng mả ng nà y bằ ng thuậ t toá n BFS hoặ c


DFS.

– Trả lờ i cá c truy vấ n: Nếu DD[x]<>DD[y] thì kết quả là YES (bở i vì khi ta bỏ cạ nh 2 ra, mà ko thể đi từ x
đến y thì dễ dà ng suy ra đồ thị ban đầ u nếu đi từ x đến y sẽ đi qua cạ nh 2). Ngượ c lạ i là NO.

Link đề và test: http://vn.spoj.com/problems/C11BC2/

Chương trình mẫu: http://ideone.com/YrAqX5

Nhận xét:
Bà i cơ bả n á p dụ ng DFS để đá nh dấ u cá c thà nh phầ n liên thô ng, có sử dụ ng thêm mộ t chú t khéo léo trong
quá trình xử lý.

3.3. Đánh số các thành phần liên thông (Floodfill)


Thủ tụ c DFS cò n đượ c sử dụ ng trong nhiều bà i toá n gá n nhã n cá c thà nh phầ n (floodfill)
như sau: Cho đồ thị, tô mà u giố ng nhau cho cá c đỉnh cù ng thà nh phầ n liên thô ng (TPLT 1 đượ c
gá n nhã n 1 – mà u 1; TPLT 2 đượ c gá n nhã n 2 – mà u 2....). Thủ tụ c DFS sẽ đượ c cả i tiến thà nh thủ
tụ c tomau dướ i đâ y. Sau khi thự c hiện chương trình; ở mả ng đá nh dấ u d, cá c đỉnh thuộ c TPLT 1
sẽ có giá trị d[i]=1; cá c TPLT 2 sẽ có giá trị d[i]=2, ….

Đâ y là mộ t kỹ thuậ t rấ t quen thuộ c và gặ p ở nhiều bà i toá n.

Bài 4. Ốc sên ăn rau (OCSE)

Đề bài
Có mộ t khu vườ n hình chữ nhậ t kích thướ c n x m ô vuô ng (n dò ng, m cộ t). Ta đá nh số cá c dò ng từ
1 đến n theo chiều từ trên xuố ng dướ i, cá c cộ t từ 1 đến m theo chiều từ trá i qua phả i. Tạ i nhữ ng ô
vuô ng là đấ t bình thườ ng ngườ i ta trồ ng rau. Tuy nhiên có mộ t số ô là đá nên khô ng trồ ng rau
đượ c. Có mộ t chú ố c sên tạ i ô (y, x), y là vị trí dò ng, x là vị trí cộ t. Từ mộ t ô , chú ố c sên chỉ có thể di
chuyển sang 4 ô liền kề (y-1, x), (y+1, x), (y, x-1), (y, x+1). Nếu gặ p ô đá thì ố c sên khô ng đi và o
đượ c.

Ố c sên đang rấ t đó i. Bạ n hã y xá c định xem chú có thể ă n đượ c số lượ ng rau nhiều nhấ t là bao
nhiêu.
Dữ liệu vào: gồ m cá c dò ng sau:
- Dò ng thứ nhấ t gồ m bố n số nguyên n, m, y, x, mỗ i số cá c nhau mộ t khoả ng trắ ng (1 ≤ y ≤ n ≤
100,1 ≤ x ≤ m ≤ 100).
- Trong n dò ng tiếp theo, mỗ i dò ng gồ m m số nguyên 0 hoặ c 1 biểu thị vườ n rau, mỗ i số cá ch
nhau mộ t khoả ng trắ ng. Số 0 nghĩa là ô rau, cò n số 1 nghĩa là ô đá .
(Dữ liệu cho đả m bả o ô (y, x) là ô rau)
Dữ liệu xuất:
- Là mộ t số nguyên xá c định số lượ ng ô lớ n nhấ t mà ố c sên có thể di chuyển đến.
Ví dụ:

Thuật toán
Dù ng DFS loang từ vị trí đứ ng củ a con sên, trong quá trình loang đếm số lượ ng ô là rau mà con sên đi qua.

Chương trình mẫu: http://ideone.com/O7BNKC

Test: http://laptrinh.ntu.edu.vn/Problem/Details/51

Nhận xét
Bà i OCSE là dạ ng đơn giả n, á p dụ ng DFS để loang trên ma trậ n.

Bài 5. Đếm ao (BCLKCOUN)

Đề bài
Sau khi kết thú c OLP Tin Họ c SV, mộ t số OLP-er quyết định đầ u tứ thuê đấ t để trồ ng rà u.
Mả nh đấ t thuê là mộ t hình chữ nhậ t N x M (1<=N<=100; 1<=M<=100) ô đấ t hình vuô ng. Nhứ ng
chỉ sà u đó và i ngà y, trậ n lụ t khủ ng khiếp đã diễn rà là m mộ t số ô đấ t bị ngậ p. Mả nh đấ t biến thà nh
mộ t số cá c à o. Cá c OLP-er quyết định chuyển sà ng nuô i cá . Vấ n đề lạ i nả y sinh, cá c OLP-er muố n
biết mả nh đấ t chià thà nh bà o nhiêu cá i à o để có thể tính toá n nuô i trồ ng hợ p lý. Bạ n hã y giú p cá c
bạ n ý nhé.

Chú ý: Ao là gồ m mộ t số ô đấ t bị ngậ p có chung đỉnh. Dễ nhậ n thấ y là mộ t ô đấ t có thể có


tố i đà 8 ô chung đỉnh.

Input:

o Dò ng1: 2 số nguyên cá ch nhà u bở i dấ u cá ch: N và M


o Dò ng 2..N+1: M kí tự liên tiếp nhà u mỗ i dò ng đạ i diện cho 1 hà ng cá c ô đấ t. Mỗ i kí tự là ‘W’
hoặ c ‘.’ tứ ơng ứ ng vớ i ô đấ t đã bị ngậ p và ô đấ t vẫ n cò n nguyên.

Output:

o 1 dò ng chứ à 1 số nguyên duy nhấ t là số ao tạ o thà nh.

Ví dụ:

Input Output
10 12 3
W……..WW.
.WWW…..WWW
….WW…WW.
………WW.
………W..
..W……W..
.W.W…..WW.
W.W.W…..W.
.W.W……W.
..W…….W.

Thuật toán:
Tiến hà nh dù ng DFS để đếm số lượ ng cá c vù ng chứ a kí tự ‘W’

Chương trình mẫu: http://ideone.com/8lD8xw

Test: http://www.spoj.com/PTIT/problems/BCLKCOUN/

Nhận xét
Bà i nà y tương tự bà i OCSE, chú ý cá c đỉnh thuộ c cù ng TPLT vớ i 1 ô là 8 ô kề cạ nh, chung đỉnh

Bài 6. Bảo vệ nông trang (NKGUARD)

Đề bài:
Nô ng trang có rấ t nhiều ngọ n đồ i nú i, để bả o vệ nô ng trang nô ng dâ n John muố n đặ t ngườ i
canh gá c trên cá c ngọ n đồ i nà y. Anh ta bă n khoă n khô ng biết sẽ cầ n bà o nhiêu ngườ i canh gá c nếu
như anh ta muố n đặ t 1 ngườ i canh gá c trên đỉnh củ a mỗ i đồ i. Anh ta có bả n đồ củ a nô ng trang là
mộ t ma trậ n gồ m N (1 < N <= 700) hà ng và M (1 < M <= 700) cộ t. Mỗ i phầ n tử củ a ma trậ n là độ
cà o H_ij so vớ i mặ t nướ c biển (0 <= H_ij <= 10,000) củ a ô (i, j). Hã y giú p anh ta xá c định số lượ ng
đỉnh đồ i trên bả n đồ . Đỉnh đồ i là 1 hoặ c nhiều ô nằ m kề nhau củ a ma trậ n có cù ng độ cao đượ c
bao quanh bở i cạ nh củ a bả n đồ hoặ c bở i cá c ô có độ cao nhỏ hơn. Hai ô gọ i là kề nhau nếu độ
chênh lệch giữ a tọ a độ X khô ng quá 1 và chênh lệch tọ a độ Y khô ng quá 1.

Input:

o Dò ng 1: Hà i số nguyên cá ch nhau bở i dấ u cá ch: N và M


o Dò ng 2..N+1: Dò ng i+1 mô tả hà ng i củ a mà trậ n vớ i M số nguyên cá ch nhau bở i dấ u cá ch:
H_ij

Output:

o Dò ng 1: Mộ t số nguyên duy nhấ t là số lượ ng đỉnh đồ i.

Ví dụ:

Thuật toán
Từ 1 ô chưa duyệt, ta đi đến nhữ ng ô có cù ng độ cao vớ i nó và đá nh dấ u lạ i. Nếu gặ p phả i mộ t ô có độ
cao lớ n hơn thì đá nh dấ u đâ y khô ng phả i là đỉnh đồ i.

Chương trình mẫu: http://ideone.com/qfyDb5

Test: http://vn.spoj.com/problems/NKGUARD/

Nhận xét
Bà i toá n sử dụ ng DFS trên ma trậ n 2 chiều như 2 bà i trên nhưng mứ c độ khó hơn.

Bài 7. (Tự giải) Trò chơi Lines (LINES)

Đề bài
Trò chơi Line là trò chơi di chuyển cá c viên bi trong mộ t hình
vuô ng 9 x 9 ô . Bi đượ c ă n khi tạ o thà nh cá c hà ng, cộ t, đườ ng chéo gồ m 5
viên bi liên tiếp cù ng mà u.
Mộ t thuậ t toá n đượ c sử dụ ng trong trò chơi là tìm đườ ng đi để di
chuyển mộ t viên bi. Giả sử trò chơi Line tổ ng quá t có n dò ng, n cộ t.
Đá nh số cá c dò ng từ 1 đến n theo thứ tự từ trên xuố ng dướ i, đá nh số cá c
cộ t từ 1 đến n theo thứ tự từ trá i sang phả i. Giả sử có mộ t viên bi tạ i ô (y,
x) - dò ng y cộ t x, bi có thể di chuyển đến 1 trong 4 ô (y+1, x), (y-1, x), (y, x+1), (y, x-1), nếu ô đó
đang trố ng. Cho vị trí bắ t đầ u và vị trí kết thú c củ a viên bi, hã y viết chương trình xá c định xem có
tồ n tạ i đườ ng đi để di chuyển viên bi hay khô ng.
Input: gồ m cá c dò ng sau
- Dò ng thứ nhấ t gồ m nă m số n, sy, sx, dy, dx, mỗ i số cá ch nhau mộ t khoả ng trắ ng (2 ≤ n ≤ 9; 1
≤ sy, sx, dy, dx≤ n). sy là chỉ số dò ng, sx là chỉ số cộ t củ a viên bi cầ n di chuyển. dy là chỉ số
dò ng, dx là chỉ số cộ t củ a vị trí cầ n di chuyển viên bi đến.
- Trong n dò ng tiếp theo, mỗ i dò ng gồ m n số nguyên 0 hoặ c 1, mỗ i số cá ch nhau mộ t khoả ng
trắ ng, biểu thị tình trạ ng củ a trò chơi. Số 1 nghĩa là vị trí ô đó có bi, số 0 nghĩa là vị trí ô đó
đang trố ng.
(Dữ liệu cho bả o đả m tạ i ô (sy, sx) có giá trị là 1, tạ i ô (dy, dx) có giá trị là 0)
Output:
- Nếu tìm đượ c đườ ng đi, in ra YES.
- Nếu khô ng tìm đượ c đườ ng đi, in ra NO.
Ví dụ:
Input Output
21122 YES
10
10
21122 NO
11
10
31133 YES
101
100
110

Test: http://laptrinh.ntu.edu.vn/Problem/Details/107

Bài 8. Kết nối (CONNECT) – Trại hè HV 2015 – K11

Đề bài
Lên LS tham dự trạ i hè HV, Sơn Tù ng gặ p lạ i cô bạ n cù ng ô n thi độ i tuyển nă m ngoá i. Sau khi
hà n huyên đủ thứ , cô bạ n muố n Sơn Tù ng trợ giú p về vấ n đề đang gặ p phả i.
Tỉnh LS có N thà nh phố , đượ c đá nh số từ 1 đến N. Hai thà nh phố i và j (1 ≤ i, j ≤ N) có thể
có nhiều nhấ t mộ t con đườ ng tỉnh lộ hai chiều nố i vớ i nhau. Ủ y ban nhâ n dâ n tỉnh LS quyết định
mở thêm mộ t con đườ ng mớ i nố i trự c tiếp giữ a hai thà nh phố bấ t kỳ nà o đó trong N thà nh phố và
xâ y dự ng mộ t sâ n vậ n độ ng tạ i mộ t thà nh phố nà o đó vớ i tiêu chuẩ n Olympic để tạ o điều kiện cho
nhâ n dâ n luyện tậ p và thi đấ u thể thao.
Cô bạ n nhờ Sơn Tù ng tính toá n xem sâ n vậ n độ ng nà y có thể kết nố i nhiều nhấ t là bao
nhiêu thà nh phố vớ i nhau, biết rằ ng thà nh phố định xâ y sâ n vậ n độ ng và nhữ ng thà nh phố khá c
đều có đườ ng đi (trự c tiếp hoặ c giá n tiếp) đến để luyện tậ p và thi đấ u thể thao.
Dữ liệu:
 Dò ng đầ u ghi hai số nguyên N – số thà nh phố và M – số đườ ng tỉnh lộ nố i giữ a hai thà nh
phố vớ i nhau.
 M dò ng sau, mỗ i dò ng ghi hai số nguyên dương i và j thể hiện thà nh phố i có đườ ng tỉnh lộ
nố i vớ i thà nh phố j.
Kết quả: Ghi số nguyên dương là số thà nh phố lớ n nhấ t mà ngườ i dâ n tạ i đó có thể tớ i
luyện tậ p và thi đấ u thể thao.
Ví dụ:
Input output
10 6 7
12
54
67
10 8
78
34
Ràng buộc: 1 ≤ N ≤ 1000, 0 ≤ M ≤ 10000, 1 ≤ i, j ≤ N
Cá c số trên cù ng mộ t dò ng cá ch nhau bở i mộ t khoả ng trắ ng (space).

Code mẫu
const
fi='connect.inp';
fo='connect.out';
maxn=100000;

Type banghi=record
d,c:longint;
end;

var adj:array[1..2*maxn] of longint;


lt,head:array[1..maxn+1] of longint;
e:array[1..2*maxn] of banghi;
kt:array[1..maxn] of boolean;
m,n,kq,max1,max2,stplt:longint;

procedure docdl;
var f:text;
i:longint;
Begin
Assign(f,fi);
Reset(f);
Readln(f,n,m);
for i:=1 to m do
begin
readln(f,e[i].d,e[i].c);
e[m+i].d:=e[i].c;
e[m+i].c:=e[i].d;
end;
m:=2*m;
for i:=1 to n do head[i]:=0;
for i:=1 to m do
with e[i] do
head[d]:=head[d]+1;
for i:=2 to n do head[i]:=head[i-1]+head[i];
for i:=m downto 1 do
with e[i] do
Begin
adj[head[d]]:=c;
dec(head[d]);
End;
head[n+1]:=m;
close(f);
End;

function dfs(u:longint):longint;
var v:longint;
Begin
inc(lt[stplt]);
kt[u]:=false;
for v:=head[u]+1 to head[u+1] do
if kt[adj[v]] then dfs(adj[v]);
End;

procedure xuli;
var i:longint;
Begin
fillchar(kt,sizeof(kt),true);
fillchar(lt,sizeof(lt),0);
stplt:=0;
for i:=1 to n do
if kt[i] then
Begin
inc(stplt);
dfs(i)
end;

max1:=0;
max2:=0;
for i:=1 to stplt do
if lt[i]>max1 then
begin
max2:=max1;
max1:=lt[i];
end
else
if max2<lt[i] then max2:=lt[i];
End;

procedure ghikq;
var f:text;
Begin
Assign(f,fo);
Rewrite(f);
Write(f,max1+max2);
close(f);
End;

BEGIN
Docdl;
Xuli;
Ghikq;
END.
Bài 9. Bãi cỏ ngon nhất (VBGRASS)

Đề bài: http://vn.spoj.com/problems/VBGRASS/

Code mẫu: http://ideone.com/KJEqYQ

Thuật toán: Dùng DFS đêm số lượng TPLT. Bài này cơ bản dễ.

Bài 10. NƯỚC BIỂN (BCISLAND)

Đề bài:
Trá i đấ t nó ng lên kéo theo mự c nứ ớ c biển dâ ng. Hò n đả o nhỏ Gonnà sinkà thuê bạ n để dự bá o
trứ ớ c hiểm họ à nà y. Cho trứ ớ c 1 lứ ớ i tọ à độ thể hiện cà o độ củ à đả o, hã y giú p họ tính toá n xem
nứ ớ c biển dâ ng cà o bà o nhiêu thì hò n đả o sẽ bị chià cắ t.

Input:

Input gồ m nhiều bộ test, mỗ i bộ test bà o gồ m:

o Dò ng đầ u ghi 2 số n, m là chiều dà i và chiều rộ ng.


o Sau đó là n dò ng, mỗ i dò ng gồ m m số , mỗ i số cho biết độ cao củ à ô đó , giá trị 0 chỉ mự c
nứ ớ c biển. Nhữ ng ô giá trị 0 dọ c theo đứ ờ ng viền và nhữ ng ô số 0 liền kề nhữ ng ô nà y chỉ
mặ t biển. Nhữ ng ô có giá trị 0 cò n lạ i (đứ ợ c bao bọ c bở i cá c số > 0) là đấ t liền bên trong
đả o nhứ ng có độ cao ngang mặ t nứ ớ c biển. Hò n đả o lú c đầ u chứ à bị chia cắ t. Số n và m
khô ng lớ n hơn 100 và độ cao khô ng lớ n hơn 1000.
o Dò ng cuố i cù ng củ a input chứ a 2 số 0

Output:

Vớ i mỗ i bộ test, in ra:

Case n: Island splits when ocean raises f feet. (Đả o bị chia khi nướ c biển dâ ng cao f feet)

Hoặ c:

Case n: Island never splits. (Đả o khô ng bà o giờ bị chià cắ t)

Ví dụ:
Thuật toán:
Dù ng DFS đá nh dấ u cá c ô có độ cao <=L ta đượ c mả ng đá nh dấ u d; vớ i mỗ i độ cao x, đếm số lượ ng TPLT là
cá c đỉnh có độ cao >x, nếu số lượ ng TLPT >1 thì đả o bị chia cắ t, lú c nà y in ra kết quả và thoá t khỏ i chương
trình.

Code mẫu: http://ideone.com/3xsDwK

Test: http://www.spoj.com/PTIT/problems/BCISLAND/

Nhận xét:
Bà i nà y khá hay, yêu cầ u HS nhậ n biết đượ c dù ng DFS để đá nh dấ u, đếm số lượ ng TPLT trên mả ng đá nh
dấ u. Chú ý : xử lý khéo để có đượ c mả ng đá nh dấ u

Bài 11. Tính toán lượng nước (PBCWATER)

Đề bài:
Nền phẳ ng củ a 1 cô ng trình xâ y dự ng đượ c chia thà nh lướ i ô vuô ng đơn vị kích thướ c MxN ô .
Trên mỗ i ô (i,j) củ a lướ i, ngườ i ta dự ng 1 cộ t bê tô ng hình hộ p có đá y là ô (i,j) và chiều cao là h[i,j]
đơn vị. Sau khi dự ng xong thì trờ i đổ mưa to và đủ lâ u. Nhà thầ u xâ y dự ng muố n tính lượ ng nướ c
đọ ng lạ i giữ a cá c cộ t để có kế hoạ ch thi cô ng tiếp theo. Giả thiết, nướ c ko thẩ m thấ u qua cá c cộ t bê
tô ng cũ ng như ko rò rỉ qua cá c đườ ng ghép giữ a chú ng.

Nhiệm vụ củ a bạ n là giú p nhà thầ u tính toá n lượ ng nướ c đọ ng lạ i giữ a cá c cộ t.

Input:

 Dò ng đầ u tiên ghi 2 số nguyên dương M và N


 Dò ng thứ i trong M dò ng tiếp theo, ghi N số nguyên dương h[i,1],h[i,2]…h[i,N].
Output

 1 dò ng duy nhấ t chứ a số đơn vị khố i nướ c đọ ng lạ i.

Ví dụ:
Input:
55
99999
92229
92529
92229
99999

Output:
60

Giới hạn:
1<=M,N<=100,1<=H[i,j]<=1000

Thuật toán:
Gọ i a là tấ m bả ng nền mô hình vớ i kích thướ c n*m và a(i,j) là chiều cao củ a cộ t nhự a vuô ng đặ t
trên ô (i,j). Thoạ t tiên ta giả sử chiều cao tố i đa củ a cá c cộ t là 1, như vậ y cá c ô trên nền nhà chỉ
chứ a cá c giá trị 0 hoặ c 1.

1 1 1 1 1 1 1

1 1 0 0 0 0 0

1 1 1 1 0 1 1

1 0 1 1 0 1 1

1 0 1 1 1 1 1

1 0 1 0 0 1 1

1 1 1 1 1 1 1
Nền tầ ng 1 vớ i cá c ô đặ c mang giá trị 1, ô chứ a nướ c đọ ng mà u trắ ng (0) và ô thoá t nướ c mà u
xá m (0).
Có 5 ô trắ ng bị giam nên thể tích nướ c đọ ng sẽ là 5.
Cá c ô liên thô ng vớ i ô trố ng trên biên sẽ tạ o thà nh nộ t cố ng thoá t nướ c ra ngoà i mô hình. Ô mang
giá trị 0 chính là mặ t sà n, cò n ô mang giá trị 1 chính là cộ t. Bâ y giờ bạ n thử ró t nướ c và o mô hình
đơn giả n nà y cho ngậ p cá c ô và quan sá t điều gì sẽ xả y ra. Dễ thấ y là chỉ có cá c ô trố ng bị giam tạ i
giữ a mô hình là cò n chứ a nướ c. Có 5 ô trố ng bị giam nên thể tích nướ c đọ ng sẽ là 5. Cá c ô trố ng
(mang giá trị 0) liên thô ng cạ nh vớ i mộ t ô trố ng trên biên sẽ tạ o thà nh mộ t cố ng thoá t nưở c ra
ngoà i mô hình. Nhậ n xét nà y cho ta thuậ t toá n tính lượ ng nướ c đọ ng tạ i tầ ng nền (tầ ng 0) củ a mô
hình như sau: Duỵ ệt đườ ng biên, nếu gặ p ô trố ng (trên biên và chứ a trị 0) thì gọ i thủ tụ c loang
đá nh dấ u cá c ô nà y bằ ng giá trị 1. Duyệt cá c ô lọ t trong mô hình, đếm cá c ô trố ng (chứ a giá trị 0)
và đồ ng thờ i đá nh dấ u cá c ô nà y bằ ng giá trị 1. Đó là thể tich nướ c đọ ng. Tiếp theo, sau khi đã
duyệt và tính lượ ng nướ c đọ ng tạ i tầ ng nền (tầ ng 0), bạ n dễ dà ng suy ra cá ch tính lượ ng nướ c
đọ ng tạ i tầ ng 1 nếu như coi cá c ô trố ng đã duyệt tạ i tầ ng 0 đã đượ c lấ p bằ ng cá c khố i nhự a chiều
cao 1. Ta gọ i phương thứ c nà y là đó ng bă ng cá c ô đã xử lí. Tổ ng quá t, tạ i tầ ng h ta thự c hiện thủ
tụ c tương tự như tạ i tầ ng nền vớ i chú t điều chỉnh là thay giá trị đá nh dấ u bằ ng h+1 thay vì bằ ng 1.
Gọ i chiều cao tố i đa củ a cá c cộ t là hmax, cho h biến thiên từ 0 đến hmax – 1 ta tính đượ c tổ ng khố i
nướ c đọ ng củ a mô hình. Để thự c hiên thuậ t toá n loang bạ n nhớ khở i trị mọ i ô củ a nền nhà là -1.

Thủ tụ c Loang(u, v, h)

1. Xét giá trị củ a ô (i,j):


Nếu a(i,j) = h thì1.1 Thay a(i,j) bằ ng h+1;1.2 Loang tiếp sang 4 ô kề: (i,j+1), (i,j-1), (i+1,j) và (i-1,j) 2.
end.

Code mẫu: http://ideone.com/bHmvZP

Test: http://vn.spoj.com/problems/PBCWATER/

Nhận xét: dạng khác của việc dùng DFS: loang theo lớp; đóng băng các vùng đã xử lý.

Bài 12. (Tham khảo) UVa 00260 - Il Gioco dell’X

Bài 13. (Tham khảo) UVa 00469 - Wetlands of Florida

Bài 14. (Tham khảo) UVa 00572 - Oil Deposits

Bài 15. (Tham khảo) UVa 00785 - Grid Colouring

3.4. Liệt kê khớp, cầu của đồ thị vô hướng


Mộ t ứ ng dụ ng khá c củ a DFS là kiểm tra đỉnh khớ p, cạ nh cầ u củ a đồ thị bằ ng cá ch khả o sá t giá trị
Low, num củ a cá c đỉnh trong quá trình duyệt DFS. Chương trình dướ i đâ y sẽ cho phép liệt kê cá c
khớ p, cầ u củ a đồ thị nhậ p và o – bà i GRAPH_

Bài 16. Khớp và cầu cơ bản (GRAPH_)

Đề bài
Xét đơn đồ thị vô hướ ng G = (V, E) có n(1<=n<=10000) đỉnh và m(1<=m<=50000) cạ nh. Ngườ i ta
định nghĩa mộ t đỉnh gọ i là khớ p nếu như xoá đỉnh đó sẽ là m tă ng số thà nh phầ n liên thô ng củ a đồ
thị. Tương tự như vậ y, mộ t cạ nh đượ c gọ i là cầ u nếu xoá cạ nh đó sẽ là m tă ng số thà nh phầ n liên
thô ng củ a đồ thị.
Vấ n đề đặ t ra là cầ n phả i đếm tấ t cả cá c khớ p và cầ u củ a đồ thị G.
Input:

 Dò ng đầ u: chứ a hai số tự nhiên n,m.


 M dò ng sau mỗ i dò ng chứ a mộ t cặ p số (u,v) (u<>v, 1<=u<=n, 1<=v<n) mô tả mộ t cạ nh củ a
G.
Output:

 Gồ m mộ t dò ng duy nhấ t ghi hai số , số thứ nhấ t là số khớ p, số thứ hai là số cầ u củ a G


Ví dụ:

Input:
10 12
1 10
10 2
10 3
24
45
52
36
67
73
78
89
97

Output:
43
Thuật toán: tìm khớp cầu cơ bản

Code mẫu: http://ideone.com/gtnfCv

Test: http://vn.spoj.com/problems/GRAPH_/

Nhận xét: tìm khớp cầu cơ bản

Bài 17. Điều kiện thời tiết (WEATHER)

Đề bài + Test: http://vn.spoj.com/problems/WEATHER/

Code mẫu: http://ideone.com/DeUfCw

Bài 18. Thành phố trọng yếu (CRITICAL)

Đề bài + Test: http://vn.spoj.com/problems/CRITICAL/

Code mẫu: http://ideone.com/CmciaP

Bài 19. Phương án bắn pháo (BCACM11E)

Đề bài + Test: http://www.spoj.com/PTIT/problems/BCACM11E/

Code mẫu: http://ideone.com/Ge9ggu

Bài 20. Mạng máy tính an toàn (SAFENET2)

Đề bài + Test: http://vn.spoj.com/problems/SAFENET2/

Code mẫu: http://ideone.com/zOc7zp

Bài 21. (Tham khảo) UVa 00315 – Network

Bài 22. (Tham khảo) UVa 00610 - Street Directions (finding bridges)

Bài 23. (Tham khảo) UVa 00796 - Critical Links * (finding bridges)

Bài 24. (Tham khảo) UVa 10199 - Tourist Guide (finding articulation points)

Bài 25. (Tham khảo) UVa 10765 - Doves and Bombs * (finding articulation points)

3.5. Tìm thành phần liên thông mạnh trên đồ thị có hướng

Bài 26. (Tham khảo) Tìm thành phần liên thông mạnh (TJALG)

Bài 27. (Tham khảo) Truyền tin (MESSAGE)

Bài 28. (Tham khảo) Biến đổi số (NUMBER)

Bài 29. (Tham khảo) Cho kẹo hay bị phá nào (TREAT)

Bài 30. (Tham khảo) UVa 11838 - Come and Go (check if graph is strongly connected)
Bài 31. (Tham khảo) UVa 00247 - Calling Circles * (SCC + printing solution)

Bài 32. (Tham khảo) UVa 11709 - Trust Groups (find number of SCC)

You might also like