1. Trang chủ
  2. » Giáo án - Bài giảng

Giáo trình thuật toán phần 3

579 13 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 579
Dung lượng 37,21 MB

Nội dung

Trang 2

Mo dau

Đồ thị là một cấu trúc dữ liệu phổ biến trong khoa học máy tính và

các thuật toán để làm việc với chúng là cần thiết cho lĩnh vực này Có hàng trăm bài toán điện toán đáng quan tâm được định nghĩa theo dạng đồ thị Trong phần này, ta để cập một số bài toán quan trọng

Chương 23 nêu cách biểu diễn một để thị trên một máy tính rỗi mơ tả các thuật tốn dựa trên việc tìm kiếm trong một đồ thị bằng phương pháp tìm kiếm độ rộng đầu tiên hoặc tìm kiếm độ sâu đầu tiên Ta sẽ mô tả hai ứng dụng của phương pháp tìm kiếm độ sâu đầu tiên: sắp xếp theo tôpô một đồ thị phí chu trình có hướng và phân tích một đề thị có hướng thành các thành phần liên thông mạnh của nó

Chương 24 mô tả cách tính một cây tổa nhánh có trọng số cực tiểu của một đồ thị Một cây như vậy được định nghĩa là con đường có trọng số nhỏ nhất để liên thông tất cả các đỉnh với nhau khi mỗi cạnh có một trọng số kết hợp Các thuật toán để tính toán các cây tỏa nhánh cực tiểu là những ví dụ tốt về các thuật toán tham (xem Chương l7)

Các chương: 25 và 26 sẽ xét bài toán tính các lộ trình ngắn nhất giữa các đỉnh khi mỗi cạnh có một chiều dài hoặc “trọng số" kết hợp Chương

25 xem xét cách tính các lộ trình ngắn nhất từ một đỉnh nguồn đã cho đến tất cả các đỉnh khác và Chương 26 giải thích cách tính các lộ trình ngắn nhất giữa mọi cặp đỉnh

Cuối cùng Chương 27 nẻu cách tính toán một luỏng vật liệu cực đạn trong mot mang ( (đồ thị có hướng) có một nguồn vặt liệu đãđịnh một bổn dadinh và các dung lượng đã định cho lượng vật liệu có thể băng ngàng môi cạnh có hướng, Bài toán chung này nảy sinh theo nhiều dang, va co the dùng một thuật toán tốt để tính toán các luỗng cực đại

nhằm giải quyết hiệu quả nhiều bài toán có liên quan

Trong khi mô tả thời gian thực hiện của một thuật toán đồ thị trẻi,

mot dé thi di cho G = (V, #), ta thường do kích cỡ nhập liệu theo dang

Trang 3

520 Phần VỊ Thuật Toán Đồ Thị

hai tham số liên quan mô tổ kích cỡ nhập liệu, chứ không chỉ một Ta chấp nhận một quy ước ký hiệu chung cho các tham số này Bên trong

hệ ký hiệu tiệm cận (như hệ ký hiệu Ó hoặc ©), và chí bên trong hệ ký

hiệu đó ký hiệu V mới thể hiện | Ì và ký hiệu E thé hiện |£ | Ví dụ

tạ có thể nói, “thuật toán chạy trong thời gian Ó(V E),” nghĩa là thuật toán chạy trong thời gian Od VI LEl) Quy ước này khiến các công thức thời gian thực hiện đễ đọc hơn mà không bị tối nghĩa

Trang 4

23 Các Thuật Toán Đồ Thị Căn Bản

Chương này trình bày các phương pháp để biểu thị một đồ thị và để

tìm kiếm trong để thị Tìm kiếm trong một để thị có nghĩa là theo các cạnh đồ thị một cách có hệ thống để ghé thăm các đỉnh của đồ thị Một

thuật toán tìm kiếm dé thi có thể khám phá nhiều về cấu trúc của một

đồ thị Nhiều thuật toán bắt đầu bằng cách tìm kiếm trong đồ thị nhập

liệu của chúng để có được thông tin cấu trúc này

Các thuật toán đổ thị khác được tổ chức dưới dạng cụ thể hóa đơn giản các thuật toán tìm kiếm đồ thị cơ bản Các kỹ thuật để tìm kiếm trong một đồ thị là trung tâm của lĩnh vực các thuật tốn đồ thị

Đoạn 23.1 mơ tả hai phép biểu diễn tính tốn thơng dụng nhất của đồ thị: dưới dạng các danh sách kể và các ma trận kê Đoạn 23.2 trình

bày một thuật toán tìm kiếm đề thị đơn giản có tên tìm kiếm độ rộng

đầu tiên và nêu cách tạo một cây độ rộng đầu tiên Đoạn 23.3 trình bày

ˆ thuật toán tìm kiếm độ sâu đầu tiên và chứng minh vài kết quả chuẩn

về thứ tự ở đó thuật toán tìm kiếm độ sâu đầu tiên ghé thăm các đỉnh

Đoạn 23.4 cung cấp ứng dụng thực đầu tiên về tìm kiếm độ sâu đầu tiên: sắp xếp theo tôpô một đồ thị phi chu trình có hướng Doan 23.5 nêu một ứng dụng thứ hai về tìm kiếm độ sâu đầu tiên: tìm các thành phần liên thông mạnh của một đỗ thị có hướng

23.1 Các phép biểu diễn của đồ thị

Có hai cách chuẩn để hiểu diễn một đề thị Œ = ( V, £): dưới dạng một

tập hợp các danh sách kẻ hoặc một ma trận kể Phép biểu diễn danh sách kể thường được ưa dùng, bởi nó cung cấp một cách nén gọn để biểu diễn các đồ thị thua [sparse graph]—là những đồ thị mà | £Ì nhỏ

hơn nhiều so với | V |?, Hầu hết các thuật toán đồ thị trình bày trong

cuốn sách này mặc nhận một đồ thị nhập liệu được biểu thị theo dạng

danh sách kể Tuy nhiên, phép biểu diễn ma trận kể có thể được ưa

Trang 5

Chương 23 Các Thuật Toún Đồ Thị Căn Bán

trình bày trong Chương 26 mặc nhận rằng đồ thị nhập liệu của chúng

được biểu thị bởi các ma trận kể

Phép biểu diễn danh sách kề [adjacency-Ìist representation] của một dé thị Œ = ( V, E) bao gồm một mảng A47 gồm | VÌ danh sách một cho từng đỉnh trong V Với từng w V, danh sách ké Adj[u] chifa (trổ đến) tất

cả các đỉnh y sao cho có một cạnh (w, ») 6 E Nghĩa là, Adj[¿] bao gồm

tất cả các đỉnh kể với trong Œ Các đỉnh trong mỗi danh sách kề thường

được lưu trữ theo thứ tự tùy ý Hình 23.1(b) là một phép biểu diễn danh sách kể của đổ thị không có hướng trong Hình 23.I(a) Cũng vậy, Hình 23.2(b) là một phép biểu diễn danh sách kể của đồ thị có hướng trong Hình 23.2(a) wb DN We WH ï (a) @®) (@)

Hình 23.1 Hai phép biểu diễn của một đồ thị không có hướng (a) Một đỏ thị

không có hướng Œ có năm đỉnh và bảy cạnh (b) Một phép biểu diễn danh sách kể của Œ (e) Phép biểu diễn ma trận kể của G tr Đo Q bà mm Dr te ee Awa nna (a) (b) ()

Hình 23.2 Hai phép biểu diễn của một đỗ thị có hướng (a) Một đỗ thị có hướng G có sáu đỉnh và tám cạnh (b) Một phép biểu diễn danh sách kế của

G (e) Phép biểu diễn ma trận kế của G

Nếu ỞŒ là một đồ thị có hướng tổng các chiều dài của tất cả các danh sách kể là | £Ì, bởi một cạnh của dạng (, v) được biểu thị bằng cách để % xuất hiện trong Ad//[z] Nếu G là một đồ thị không có hướng tổng các chiều dài của tất cả các danh sách kể là 2Ì £Ì, bởi nếu ( v) là một cạnh không có hướng, thì ¡ xuất hiện trong danh sách kể của + và ngược lại

Dẫu một đồ thị có hướng hay không, phép biểu diễn danh sách kể có tinh chat thỏa đáng đó là lượng bộ nhớ mà nó yêu cầu là @(max( V, E))

= OV+ E)

Trang 6

23.1 Các phép biểu diễn của đồ thị 523

trọng số {weighted graphs], nghĩa là, đồ thị mà mỗi cạnh có một freag số kết hợp, thường được cung cấp bởi một hàm trọng số w': E— R Ví dụ, cho G = (V, E) là một đồ thị gia trọng với hàm trọng số w Trọng số w{,v) của cạnh (0) € E đơn giản được lưu trữ với đỉnh v trong danh

sách kể của u Phép biểu diễn danh sách kể tổ ra khá cường tráng ở chỗ

nó có thể được sửa đổi để hỗ trợ nhiều biến thức đồ thị khác

Một nhược điểm tiểm ẩn của phép biểu diễn danh sách kể đó là để

xác định xem một cạnh đã cho (u, v) có hiện diện trong để thị hay

không, ta không có cách nào nhanh hơn là tìm kiếm v trong danh sách

kể Ađ/[u] Có thể khắc phục khuyết điểm này bằng một phép biểu diễn ma trận kể của đồ thị, để đổi lại ta phải dùng nhiều bộ nhớ hơn theo

tiệm cận

Với phép biểu diễn ma sân kê của một đô thị G = ( V, E), ta mặc nhận

các đỉnh được đánh số I, 2, , | VÌ theo một kiểu tùy ý Như vậy, phép

biểu diễn ma trận kể của "` d6 thi G bao gồm một ma trận |vl x|vị|

= (a„) sao cho

1 nếu (,j) E, ay 0 bằng không

Các Hình 23.1(c) và 23.2(c) là các ma trận kể của đồ thị không có hướng và có hướng trong các Hình 23.I(a) và 23.2(a), theo thứ tự nều trên Ma trận kể của một đổ thị yêu cầu ©(W?) bộ nhớ, độc lập với số lượng các cạnh trong đồ thị

Lưu ý tính đối xứng dọc theo đường chéo chính của ma trận kể trong Hình 23.I(c) Ta định nghĩa hoán vị của một ma trận A = (a,) là ma trận A’ = (aj, ) vi ai, =a, Bởi trong một đề thị không có hướng, (u, v) va (yu) biểu diễn cùng cạnh, ma trận kể A của một đồ thị không có hướng

là chuyển vị riêng củanó: A = A' Trong vài ứng dụng, ta sẽ có lợi khi

chỉ lưu trữ các khoản nhập trên và bên trên đường chéo của ma trận kể, nhờ đó cắt giầm hầu như một nửa lượng bộ nhớ cần có để lưu trữ đồ thị

Cũng như phép biểu diễn danh sách kể của một đồ thị, phép biểu

diễn ma trận kể có thể được dùng cho các đồ thị gia trọng Ví dụ, nếu G =(V, E) là một đề thị gia trọng có hàm trọng số cạnh w', trọng số W(, ¥) của cạnh (, +1 ÿ đơn giẩn được lưu trữ dưới dạng khoản nhập trong hàng w va cột y của ma trận kể, Nếu một cạnh không tổn tại, một giá trị NIL có thể được lưu trữ dưới đạng khoản nhập ma trận tương ứng của-

nó, dù với nhiều bài toán việc sử dụng một giá trị như 0 hoặc œ sẽ tiện

dụng hơn ,

Trang 7

ih

te Chương 33 Cúc Thuật Toan Đồ Thị Cán Bán

trận kể có thể khiến nó được ưa dùng khi đồ thị tướng đối nhỏ Hơn

nữa nếu đỏ thị không giá trọng, phép biểu diễn ma trận kể còn có

thêm một ưu điểm về kho lưu trừ Thay vì dùng một từ của bộ nhớ máy

tính cho từng khoản nhập ma trận, mà trận kể chỉ sử dụng một bịt cho

mỗi khoản nhập Bài tập 234-1

Cho một phép biểu diễn danh sách kể của một đồ thị có hướng ta

phải mất bao lâu để tính toán độ-ra [out-degree] của mọi đỉnh? Phải mất bao lâu để tính toán các độ-vào [in-degrees]?

23.1-2

Nêu một phép biểu diễn danh sách kể cho một cây nhị phân hoàn

chỉnh trên 7 đỉnh Nêu một phép biểu diễn ma trận kể tương đương Giả sử các đỉnh được đánh số từ ! đến 7 như trong một đống nhị phần

23.I-3

Hoán vị của một đỗ thị có hướng G = ( V, E) là dé thị Œ' =(V, E!).Ở dé E' = {(vy we VX Vi (uv) e E} Như vậy Œ' là Œ với mọi cạnh củanó được đảo nghịch Mô tả hiệu quả các thuật toán để tính toán G’

từ ỞŒ, với cả phép biểu diễn danh sách kẻ lẫn ma trận kể của G Phan

tích thời gian thực hiện của các thuật toán 23.1-4

Cho một phép biểu diễn danh sách kể của một đa đồ thị G =( V, E), mô tả một thuật toán @(V +E) thời gian để tính toán phép biểu diễn

danh sách kể của đề thị không có hướng "tương đương” Œ` =(V,£') ở đó £' bao gồm các cạnh trong £ với tất cả đa cạnh giữa hai đỉnh được

thay bằng một cạnh đơn và với tất cả các vòng tự lặp được gỡ bỏ

23.1-5

Bình phương của một đỗ thị có hướng G = (V, E) là đồ thị Œ? = (V E”) sao cho (, w) 6 E° nếu và chỉ nếu với một » e V, cả hai (w, v) € E va (5, w) € £ Nghĩa là, Œ? chứa một cạnh giữa œ và w mỗi khi Œ chứa một lộ trình có chính xác hai cạnh giữa # và w' Mô tả các thuật toán hiệu quả

để tính Œ° từ G với cả phép biểu diễn danh sách kể lẫn ma trận kể của

Ớ Phân tích thời gian thực hiện của các thuật toán 23.1-6

Trang 8

te vt

23.20 Tim kiểm độ ròng đầu tien 53:

toán đồ thị yêu cầu thời gian €C Ý2), nhưng có vài ngoại lệ, Chứng tỏ tiến trình xác định một đồ thị có hướng có chứa một bẩu [sink]-—mot đỉnh có độ-vào [W | - 1 và đô-ra 0_=hay không có thể được xác định trong thời gian UV), cho dù dùng phép biểu diễn ma trần kẻ 23.1-7 Ma trận liên thuộc [incidence matrix] cha mot do thi cé hudng G = (V, E) là một ma trận VÌ x|£ | Hs t5 ) sao cho -l nếu cạnh / rời đỉnh ;, b = }néu canh j nhap đỉnh ¿ 0 bing khong Mô tả nội dung mà các khoản nhập của tích ma trận 8! biểu diễn ở đó #! là chuyển vị của B

+ w Tìm kiếm độ rộng đầu tiên

Tìm kiếm độ rộng đầu tiên [breadth-first search] là một trong các

thuật toán đơn giản nhất để tìm kiếm trong một đồ thị và là nguyên mẫu

cho nhiều thuật toán đồ thị quan trọng Thuật toán các lộ trình ngắn nhất có nguồn đơn của IDijkstra (Chương 25) và thuật toán cây tỏa nhánh cực

tiểu của Prim (Đoạn 24.2) dùng các ý tưởng tương tự như trong kiểu tim

kiếm độ rộng đầu tiên

Cho một dé thi G = (V, E) và một đỉnh nguồn được đánh dấu s thuật toán tìm kiếm độ rộng đầu tiên khảo sát đối xứng các cạnh của G dé

“khám phá” mọi đỉnh khả đụng từ Nó tính toán khoảng cách (số cạnh ít nhất) từ s đến tất cả các đỉnh kha đụng như vậy Nó cũng tạo ra một “cây độ rộng đầu tiên” có gốc s chứa tất cả các đỉnh khả đựng như vậy Với một đỉnh + khả đụng từ 3, lộ trình trong cây đô rộng đầu tiên từ s đến + tương ứng với một "lộ trình ngắn nhất” từ ; đến + trong G nghia

là, một lộ trình chứa ít cạnh nhất Thuật toán lầm việc trên cả đồ thị có

hướng lẫn không có hướng

Sở đĩ gọi là tìm kiếm độ rộng đầu tiên bởi vì nó mở rộng biên giới giữa các đỉnh đã khám phá lẫn chưa khám phá một cách đồng đều qua độ rộng của biên giới Nghĩa là thuật toán khám phá tất cả các đỉnh tại khoảng cách & từ s trước khi khám phá bất kỳ đỉnh nào tại khoảng cách k+l

Trang 9

526 Chương 93 Cúc Thuật Toán Độ Thị Căn Bản

tiên gặp nó trong đợt tìm kiếm, vào lúc đó nó trở thành không trắng Do

đó, các đỉnh xám và đen đã được khám phá, nhưng thuật toán tìm kiếm

độ rộng đầu tiên sẽ phân biệt giữa chúng để bảo đảm đợt tìm kiếm tiếp

tục theo kiểu độ rộng đầu tiên Nếu (u, v) 6 E và đỉnh w là đen, thì đỉnh

+ là xám hoặc đen; nghĩa là, tất cả các đỉnh kể với các đỉnh đen đều đã

được khám phá Các đỉnh xám có thể có vài các đỉnh trắng kể; chúng biểu diễn cho biên giới giữa các đỉnh đã khám phá và chưa khám phá Thuật toán tìm kiếm độ rộng đầu tiên kiến tạo một cây độ rộng đầu tiên, thoạt đầu chỉ chứa gốc của nó là đỉnh nguồn s Mỗi khi một đỉnh trắng » được khám phá trong quá trình quét danh sách kể của một đỉnh u di khám phá, đỉnh + và cạnh (w, y) được bổ sung vào cây Ta nói rằng

w là phần tử tiền vị hoặc cha của v trong cây độ rộng đầu tiên Bởi một

đỉnh được khám phá tối đa một lần, nên nó có tối đa một cha Các mối

quan hệ tiền bối và hậu duệ trong cây độ rộng đầu tiên được định nghĩa

tương đối với gốc s như thường lệ: nếu nằm trên một lộ trình trong cây từ gốc s đến đỉnh v, thì w là một tiền bối của w và v là một hậu duệ của H

Thủ tục tìm kiếm độ rộng đầu tiên BFS dưới đây mặc nhận đồ thị

nhập liệu G = (V, E) được biểu thị bằng các danh sách kể Nó duy trì

một vài cấu trúc dữ liệu bổ sung với mỗi đỉnh trong đồ thị Mầu của mỗi

đỉnh ¿ V được lưu trữ trong biến colorful, va phần tử tiền vị của u

Trang 10

ao tw » 23.2 Tim kiém độ rộng đầu tiên 9 while Oz J 10 do u © head[Q] 1] for mdi ve Adjfu] 12 do if color[y] = WHITE 13 then color{v] — GRAY 14 d[v] — d[u] + | 15 mvieu 16 ENQUEUE(O.v) 17 DEQUEUE(Q) 18 color{u] — BLACK

Hình 23.3 minh họa tiến độ của BES trên một đổ thị mẫu

Thủ tục BES làm việc như sau Các dòng 1-4 sơn trắng mọi đỉnh ấn định ở [¿] là vô cực cho mọi đỉnh ¿ và ấn định cha của mọi đỉnh là NII Đồng 5 sơn xám đỉnh nguồn s bởi nó được xem là đã khám phá khi thủ tục bắt đầu Dòng 6 khởi tạo đ[s] theo 0, và dòng 7 ấn định phần tử tiền vị của nguồn là NIL Dòng 8 khởi tạo Q theo hàng đợi chỉ chứa đỉnh s: sau đó, @ luôn chứa tập hợp các đỉnh xám

Vòng lặp chính của chương trình được chứa trong các dòng 9-18 Vòng lặp lặp lại miễn là ở đó vẫn còn các đỉnh xám, là các đỉnh đã khám phá song các danh sách kể của chúng chưa được xem xét đầy đủ Đồng 10 xác định đỉnh xám ø tại đầu hàng đợi Ó Vòng lặp for của các

đồng EI-16 xét mỗi đỉnh v trong danh sách kể của ø Nếu + H trắng, thì

nó chưa được khám phá, và thuật toán khám phá nó bằng cách thi hành

các dong 13-16 Truge tiên nó được tô xám, và khoảng cách đ[r] của nó

Trang 11

2S (a) (c} (e) tg) wi Chương 23 Các Thuật Toán Đồ Thị Căn Ban (b) (a) oz 222 Ơ w x y r # f H đ o - 2 3 3 ¥ w + ¥ r t M (hy 9 3 ¥ W x ¥ tr s t a 90 Ø v w x ¥

Hình 23.3 Phép tốn của BFS trên một để thị không có hướng Các cạnh cây

được nêu ở dạng tô bóng vì BFS đã tạo chúng Trong mỗi đỉnh w được néu ở jul Hing doi Ở được nêu tại đầu mỗi lần lặp lại của vòng lập while trong các dòng 9-18 Các khoảng cách đỉnh được nêu cạnh các đỉnh trong hàng đỢi

Phân tích

Trước khi chứng minh tất cả các tính chất khác nhau của thuật tốn tìm kiếm đơ rộng đầu tiên ta tiến hành một công việc hơi dễ hơn đó là phân tích thời gian thực hiện của nó trên một đồ thị nhập liệu G = CV Ƒì Sau khi khởi tạo: không có đỉnh nào được tô trắng, và như vậy đợt Kiểm tra trong dòng 12 bio dim mỗi đỉnh được đưa vào hàng đợi tối đa môi lần, và đo đó ra khỏi hàng đợi tối đa một lần, Các phép toán đưa vào và lấy ra hàng đợi sẽ mất ((1) thời gian, do đó tổng thời gian dành cho các phép toán hàng đợi là ((1)

Trang 12

23.2 Tìm hiếm độ rộng đầu tiên 529

trong thời gian tuyến tính theo kich cỡ của phép biểu diễn danh sách kể

của Ở

Các lộ trình ngắn nhất

Phần đầu đoạn này ta đã xác nhận thuật toán tìm kiếm độ rộng đầu

tiên tìm khoảng cách đến từng đỉnh khả đụng trong một đồ thị Œ = (V, E) từ một đỉnh nguồn đã cho s e V Hãy định nghĩa khoảng cách lộ trình ngắn nhất õ (s, v) từ s đến v như là số cạnh tối thiểu trong bất kỳ lộ trình

nào từ đỉnh s đến đỉnh v, hoặc nếu không œ nếu không có lộ trình nào từ s đến v Một lộ trình có chiều dài ð (s, v) từ s đến v được xem là một lộ trình ngắn nhấ?' từ s đến v Trước khi chứng tổ thuật toán tìm kiếm độ rộng đầu tiên thực tế tính toán các khoảng cách lộ trình ngắn nhất, ta nghiên cứu một tính chất quan trọng của các khoảng cách lộ trình ngắn

nhất

Bổ đề 23.1

Cho Œ = (V, E) là một đồ thị có hướng hoặc không có hướng, và cho se Ylà một đỉnh tùy ý Thì, với bất kỳ cạnh (w, ») € E,

6(s, )< ð(S, ø) +1

Chứng minh Nếu w khả đụng từ s, thì v cũng vậy Trong trường hợp

này, lộ trình ngắn nhất từ s đến v không thể dài hơn lộ trình ngắn nhất từ s đến # theo sau là cạnh (w, v), và như vậy bất đẳng thức đứng vững

Nếu w không khả đụng từ s, thì õ(s, ø) = =, và bất đẳng thức đứng vững Ta muốn chứng tổ BFS tính toán đúng đắn ở [v ] = 6(s, v) với mỗi đỉnh ve V Trước tiên, ta chứng tỏ đ[r] định cận 6 (s,v) từ bên trên

Bổ đề 23.2

Cho Œ = (V E) là một để thị có hướng hoặc không có hướng, và giả sử BFS chạy trên G từ một đỉnh nguồn đã cho se V Thì khi kết thúc, với

mỗi đỉnh ›'€ W, giá trị đ [x ] đã được BFS tính toán sẽ thỏa Z[tr]> 6Œ, 9)

Chứng mình Ta dùng phương pháp quy nạp trên số lần mà một đỉnh được đặt trong hàng đợi Ợ Giả thuyết quy nạp của chúng ta đó là địn]>ð(s, v) với tất cả re V

Cơ sở của phương pháp quy nạp là tình huống ngay sau khi š được đặt trong @ trong dòng 8 của BES Ở đây giả thuyết quy nạp đứng vững bởi đ[s] =0 = ổŒ, 3) và d[t]} => ổG@ v) với tất cả ve V- {s}

Trang 13

530 Chương 23 Các Thuột Tốn Đơ Thị Can Ban

Với bước quy nạp, ta xét một đỉnh trắng v được khám phá trong đợt tìm kiếm từ một đỉnh „ Giả thuyết quy nạp hàm ý rằng đ[u]> d(s, mì) Từ phép gán được thực hiện bởi dòng l4 và từ Bổ để 23.1, ta được

dv] d{u] + | 5(s,u) +1 > d&(s,v)

Sau đó, đỉnh v được chèn vào hàng đợi Ó và nó không bao giờ được chèn trở lại bởi nó cũng được tô xám và mệnh để then của các dòng 13-16 chỉ được thi hành cho các đỉnh trắng Như vậy, giá trị của đ[v] không bao giờ thay đổi lại, và giả thuyết quy nạp được duy trì

V

Để chứng minh đ [vy ]= õŒs, v), trước tiên ta phải nêu cách hàng đợi

Q hoạt động trong tiến trình của BEFS một cách chính xác hơn Bổ để kế tiếp chứng tổ mọi lúc, ta có tối đa hai giá trị đ riêng biệt trong hàng đợi

Bổ đề 23.3

Giả sử trong khi thi hành BFS trên một đồ thị Ớ = (V, E), hàng đợi Q

chứa các đỉnh <v, vụ »>, ở đó v, là đầu của Q va v, là đuôi Như

vậy, đ[v]< đIy,]+ I và địy] < dIy,,„] với ¡= 1,2 1

Chứng mình Ta chứng mình bằng phương pháp quy nạp trên số lượng các phép toán hàng đợi Thoạt đầu, khi hàng đợi chỉ chứa s, bổ để chắc chắn đứng vững

Với bước quy nạp, ta phải chứng minh bổ để đứng vững sau khi một đỉnh được lấy ra khỏi hàng đợi lẫn đưa vào hàng đợi Nếu đầu v, của hàng đợi ra khỏi hàng đợi, đầu mới là v, (Nếu hàng đợi trở nên trống,

thì bổ để đứng vững một cách trống không.) Nhưng sau đó ta có d[v,] Š

d[vj] + 1< đfv,] + 1, và các bất đẳng thức còn lại không bị tác động

Như vậy, bổ để xảy ra với v, làm đầu Tiến trình đưa một đỉnh vào hàng đợi yêu cầu xem xét mã kỹ hơn Trong dòng 16 của BFS, khi đỉnh v được đưa vào hàng đợi như vậy trở thành 1, đầu 9, của Q thực tế là đỉnh ¿ mà danh sách kể của nó hiện đang được quét Như vậy, ¿[*,.,Ì= địy] = d{u] + 1= dt] + TL, Ta cũng có địn]< đ[v]+ 1= d[ä] + l=d [v J = d[v, |] và các bất đẳng thức còn lại không bị tác động Như vậy bố để xảy ra khi r được đưa vào hàng đợi

Trang 14

23.2 Tim kiếm độ rộng đầu tiên 531

sử BFS chạy trên GŒ từ một đỉnh nguồn đã cho s c V Như vậy, trong khi

thi hành, BFS khám phá mọi đỉnh ve V là khả đụng từ nguồn s, và khi

kết thúc, đ[v] = ð(s,v) với tất cả ve V Hơn nữa, với bất ky dinhv# sla

khả đụng từ s, một trong các lộ trình ngắn nhất từ s đến y là lộ trình ngắn nhất từ s đến z{v] theo sau là cạnh (Z{r], v)

Chưng mình Ta bắt đầu với trường hợp ở đó y không thể đụng từ s

Bởi Bổ để 23.2 cho đ[v] > õ(s,y) = ©, nên đỉnh v không thể có đ[v] được

ấn định theo một giá trị hữu hạn trong dòng 14 Với phương pháp quy nạp, không thể có một đỉnh đầu tiên có giá trị đ được dòng 14 ấn định theo œ Do đó, dòng 14 chỉ được thi hành cho các đỉnh có các giá trị đ hữu hạn Như vậy, nếu y không thể đụng, nó không bao giờ được khám phá

Phần chính của chứng minh dành cho các đỉnh khả đụng từ s Cho V, thể hiện tập hợp các đỉnh tại khoảng cách É từ s; nghĩa là, V={yeV: 65 (s, v) = k} Phép chứng minh tiến hành bằng phương pháp quy nạp trên & Với tư cách là một giả thuyết quy nạp, ta mặc nhận rằng với mỗi đỉnh y € V, ta có chính xác một điểm trong khi thi hành BFS ở đó

e y được tô xám,

e đ[y ] được ấn định theo &,

« nếu v#s, thì n[v] được ấn định theo w với một w e V, „, và e v được chèn vào hàng đợi Ớ

Như đã nêu trên đây, chắc chắn ta có tối đa một điểm như vậy Cơ bản là & = 0 Ta có W, = {s}, bởi nguồn s là đỉnh duy nhất tại khoảng cách 0 từ s Trong khi khởi tạo, s được tô xám, đ[s] được ấn định là 0, và s được đưa vào Q, do đó giả thuyết quy nạp đứng vững

Với bước quy nạp, ta bắt đầu bằng cách lưu ý rằng hàng đợi @ không bao giờ trống cho đến khi thuật toán kết thúc và, một khi một đỉnh

được chèn vào hàng đợi, cả Z[z] lẫn z{u} đều không hề thay đổi Do đó,

qua Bổ để 23.3, nếu các đỉnh được chèn vào hàng đợi trong khi thuật toán thi hành theo thứ tự +, v, , w,, thì dãy các khoảng cách sẽ tăng

đơn điệu: đ[»,] <4, ] với (= 1,22 r- 1

Giờ đây ta xét một đỉnh tùy ý v V„, ở đó & > 1 Tính chất đơn điệu, phối hợp với d[v] > & (theo Bổ để 23.2) và giả thuyết quy nạp, hàm ý

rằng v phải được khám phá sau khi tất cả các đỉnh trong V, , được đưa

vào hàng đợi, bằng không nó không được khám phá gì cả

Do õ(s, » ) = k, có một lộ trình k cạnh từ s đến », và như vậy ở đó tổn

tại một đỉnh w e V,_, sao cho (w, v) 6 È Không làm mất đi tính tổng quát

Trang 15

532 Chương 23 Các Thuật Tốn Đơ Thị Căn Bán

theo phương pháp quy nạp, tất cả các đỉnh trong V,_, được tô xám Mã cia BFS lip hàng đợi mọi đỉnh được tô xám, và do đó chung cuộc u phải xuất hiện dưới dạng đầu của hàng đợi trong đòng 10 Khi z xuất hiện dưới dạng đầu, danh sách kể của nó được quét và v được khám phá (Đỉnh v có thể chưa được khám phá trước đó, bởi nó không kể với bất kỳ đỉnh nào trong V, với j< k - I—bằng không, v có thể không thuộc về V.—và theo giả thiết, z là đỉnh đầu tiên được khám phá

trong V, „, mà v kể với nó ) Dòng I3 tô xám v, dòng I4 thiết lập d[v] =

đ[u] + 1 = k, dồng 15 ấn định n[v] theo ø, và dòng I6 chèn w vào hàng đợi Bởi v là một đỉnh tùy ý trong V„, nên giả thuyết quy nạp được chứng minh

Để kết luận chứng minh của be dé, ta nhận thấy nếu v = V,, thi theo nhu nhifng gi ta vira thay, z[v] € V,., Như vậy, ta có thể có được một lộ trình ngắn nhất từ s đến v bằng cách lấy một lộ trình ngắn nhất từ s đến Z[v] rồi băng ngang cạnh (Z[v], v)

Các cây độ rộng đầu tiên

Thủ tục BFS xây dựng một cây độ rộng đầu tiên khi nó tìm kiếm trong đồ thị, như minh họa trong Hình 23.3 Cây được biểu thị bởi trường

7 trong mỗi đỉnh Chính thức hơn, với một đổ thị Œ = (V, E) có nguồn s, ta định nghĩa đồ thị con phần tử tién vi cha G la G, = ( V, E,), 6 46

Vi= {ve Vi av] # NIL} vu {5} va

= (av, ye E:ve V,-(s}}

Đô thị con phần tử tiền vị [predecessor subgraph] Œ,, là một cây độ rộng đầu tiên nếu V„ bao gồm các đỉnh khả đụng từ s và, với tất cả ve

V,, ta có một lộ trình đơn giản duy nhất từ s đến v trong G„, cũng là một lộ trình ngắn nhất từ s đến v trong Œ Một cây độ rộng đấu tiên thực tế là một cây, bởi nó liên thông và le | = | Vị - ! (xem Định lý 5.2) Các cạnh trong £_ được gọi là các cạnh cây

Sau khi chạy BFS từ một nguồn s trên một đồ thị G, bổ để dưới đây chứng tỏ đồ thị con phần tử tiền vị là một cây độ rộng đầu tiên

Bổ đề 23.5

Khi được áp dụng cho một đỗ thị có hướng hoặc không có huéng G

= (V, E), thi tuc BFS kiến tao Z sao cho đồ thị con phần tử tiền vi G, =

(V„ E„) là một cây độ rộng đầu tiên

Trang 16

23.2 Tim kiém dé réng dau tién 533

dinh trong V kha dung tit v Do Œ„ hình thành một cây nên nó chứa một lộ trình duy nhất từ s đến mỗi đỉnh trong V Nhờ áp dụng Định lý 23.4 theo quy nạp, ta kết luận mọi lộ trình như vậy là một lộ trình ngắn nhất Thủ tục dưới đây ¡n ra các đỉnh trên một lộ trình ngắn nhất từ s đến v, giả định BFS đã chạy để tính toán cây lộ trình ngắn nhất PRINT-PATH(G, s, v) [if y = s 2 thenins 3 elseif 7z{v] =NIL 4 then print “không có lộ trình từ” s “đến” v “tổn tại” 5 else PRINT-PATH(G, s, #[v]) 6 print v

Thủ tục này chạy trong thời gian tuyến tính theo số lượng các đỉnh trong lộ trình đã in, bởi mỗi lệnh gọi đệ quy dành cho một lộ trình ngắn hơn một đỉnh

Bài tập

23.2-1

Nêu kết quả của việc chạy thuật toán tìm kiếm độ rộng đầu tiên trên

đồ thị có hướng của Hình 23.2(a), dùng đỉnh 3 làm nguồn

23.2-2

Nêu kết quả của việc chạy thuật toán tìm kiếm độ rộng đầu tiên trên

đồ thị không có hướng của Hình 23.3, dùng đỉnh z làm nguồn

23.2-3

Nêu thời gian thực hiện của BFS nếu đồ thị nhập liệu củanó được biểu thị bởi một ma trận kể và thuật toán được sửa đổi để điểu quản

dạng nhập liệu này?

23.2-4

Chứng tỏ trong một thuật toán tìm kiếm độ rộng đầu tiên, giá trị d[u] được gán cho một đỉnh w độc lập với thứ tự ở đó các đỉnh trong mỗi đanh sách kể được cho

23.2-5

Trang 17

534 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

hơn nữa không thể tạo tập hợp các cạnh E, bằng cách chạy BFS trên Ớ,

bất kể cách sắp xếp các đỉnh trong mỗi danh sách kể

23.2-6

Nêu một thuật toán hiệu quả để xác định xem một đồ thị không có hướng có phải là hai nhánh không

23.2-7 * „

Đường kính của một cây T = (V, E) được cho bởi max &(u, v) ;

wave V

nghĩa là, đường kính là lớn nhất trong tất cả các khoảng cách lộ trình

ngắn nhất trong cây Nêu một thuật toán hiệu quả để tính toán đường

kính của một cây, và phân tích thời gian thực hiện của thuật toán 23.2-8

Cho G = (V, E) là một đồ thị không có hướng Nêu một thuật toán

ÓO(V +E)-thời gian để tính toán một lộ trình trong G băng ngang mỗi

cạnh trong E chính xác một lần theo mỗi hướng Mô tả cách tìm cách thoát ra khỏi một mê cung nếu bạn có một nguồn cung cấp pemni lớn 23.3 Tìm kiếm độ sâu đầu tiên

Chiến lược mà thuật toán tìm kiếm độ sâu đầu tiên tuân thủ đó là, giống như tên gọi của nó hàm ý, để tìm kiếm “sâu hơn” trong đồ thị nếu có thể Trong thuật toán tìm kiếm độ sâu đầu tiên, các cạnh được khảo sát từ đỉnh mới được khám phá v vẫn có các cạnh chưa khảo sát rời nó Sau khi khảo sát tất cả các cạnh của v, đợt tìm kiếm “rà ngược”

để khảo sát các cạnh rời đỉnh mà từ đó v đã được khám phá Tiến trình

này tiếp tục cho đến khi ta có tất cả các đỉnh đã khám phá khá đụng từ

đỉnh nguồn ban đầu Nếu vẫn còn các đỉnh chưa khám phá, thì một

trong số chúng được chọn làm một nguồn mới và đợt tìm kiếm được lắp

lại từ nguồn đó Nguyên cả tiến trình này được lặp lại cho đến khi tất cả các đỉnh đều được khám phá

Giống như trong tìm kiếm độ rộng đầu tiên, mỗi khi một đỉnh y được khám phá trong một quét danh sách kể của một đỉnh ¿ đã khám phá, thuật toán tìm kiếm độ sâu đầu tiên ghi nhận sự kiện này bằng cách ấn

định trường tiền vị của v z{v] thành z Khác với thuật toán tìm kiếm độ

Trang 18

23.3 Tìm kiếm độ sáu đầu tiên 535

của một tìm kiếm độ sâu đầu tiên được định nghĩa hơi khác với trường hợp của tìm kiếm độ rộng đầu tiên: ta cho Œ,= ( V, E_), ở đó

E, = {(alv],v): ve Vva aly} 4 NIL}

Đồ thị con phần tử tiền vị của một đợt tìm kiếm độ sâu đầu tiên hình thành một rừng độ sâu đầu tiên bao gồm một số cây độ sâu đầu tiên Các cạnh trong E_ được gọi là các cạnh cây

Giống như trong thuật toán tìm kiếm độ rộng đầu tiên, các đỉnh được

tô màu trong đợi tìm kiếm để nêu rõ trạng thái của chúng Thoạt đầu

mỗi đỉnh là trắng, được tô xám khi nó được khám phá trong đợt tìm kiếm, và được tô đen khi nó hoàn tất, nghĩa là, khi danh sách kể củanó đã được xem xét hoàn toàn Kỹ thuật này bảo đảm mỗi đỉnh kết thúc

chính xác bằng một cây độ sâu đầu tiên, sao cho các cây này rời nhau

Ngoài việc tạo một rừng độ sâu đầu tiên, thuật toán tìm kiếm độ sâu

đầu tiên cũng gán tem thời gian cho mỗi đỉnh Mỗi đỉnh v có hai tem

thời gian: tem thời gian đầu tiên Z[v] ghi nhận thời gian v được khám phá lần đầu tiên (và được tô xám), và tem thời gian thứ hai /†v] ghi nhận thời gian đợt tìm kiếm hoàn tất việc xét đanh sách kể của v (và tô đen v) Các tem thời gian này được dùng trong nhiều thuật toán đồ thị và nói

chung là hữu ích cho việc biện luận về cách ứng xử của thuật toán tìm

kiếm độ sâu đầu tiên

Thủ tục DFS dưới đây ghi nhận thời gian nó khám phá đỉnh u trong biến đ [z] và thời gian nó hoàn tất đỉnh z trong biến ƒ [u] Các tem thời gian này là các số nguyên giữa I và 2|V |, bởi có một sự kiện khám phá và một sự kiện hoàn tất cho từng đỉnh |V | Với mọi đỉnh u,

d{u) < flu) (23.1)

Dinh wu 14 WHITE trước thời gian đ[u], GRAY giữa thời gian đ [w] và

thời gian ƒ[z], va sau dé 14 BLACK

Mã giả dưới đây là thuật toán tìm kiếm độ sâu đầu tiên cơ bản Đồ thị nhập liệu G cé thể không có hướng hoặc có hướng Biến me là một

Trang 19

536 Chuong 23 Cac Thudt Todn Dé Thi Can Ban

1 color{u] — GRAY > Dinh tring u vita dudc kham phá

2 d{[u] — time < tme + 1

3 for mGi v € Adj[u] > Khao sat canh (u, v)

4 do if color{v] = WHITE

5 then a[v] — u

6 DFS-VISIT(v )

7 color[u] - BLACK t> Tô đen z; nếu nó hoàn tất 8 flu] < time — time +]

Hình 23.4 minh họa tiến độ của DFS trên đồ thị nêu trong Hình 23.2 Thủ tục DFS làm việc như sau Các dòng 1-3 son tring tat cả các đỉnh và khởi tạo các trường Z của chúng theo NIL Dòng 4 chỉnh lại bộ đếm thời gian toàn cục Các dòng 5-7 lần lượt kiểm tra mỗi đỉnh trong V và, _

khi tìm thấy một đỉnh trắng, sẽ ghé thăm nó bằng DFS-VISIT Mỗi lần

DES-VISTT@) được gọi trong dòng 7, đỉnh w trở thành gốc của một cây

mới trong rừng độ sâu đầu tiên Khi DFS trả về, mọi đỉnh ¡ đã được gán

một thời gian khám phá đ[w] và một thời gian kết thúc /u]

(my , (ny {a} ° (

Hình 23-4 Tiến độ của thuật toán ủm kiếm do sau dau ven DES wen mot de thị có hướng Khi thuật toán khảo sát các cạnh, chúng dược nẻu dưới dạng tô

bóng (nếu là các cạnh cây) hoặc chấm cách (các trường hợp khác) Các cạnh

không thuộc cây được gán nhãn B C hoặc F tùy theo chúng là các cạnh phía sau, chéo phía trước Các đỉnh được gán tem thời gian bằng thời gian khám

Trang 20

23.3 Tin kiếm độ sâu đầu tiên 537

Trong mỗi lần gọi DES-VISIT(w), thoạt đầu đỉnh z là trắng Dòng I sơn xám u, và dòng 2 ghi nhận thời gian khám phá d[u] bing cach gia so và lưu biến toàn cục 0e Các dòng 3-6 xét mỗi đỉnh + kể với „ và ghé thăm v một cách đệ quy nếu nó là trắng Vì mỗi đỉnh » e Ad/[w] được xét trong đồng 3, ta nói rằng cạnh (u v) được khảo sát bởi đợt tìm kiếm độ sâu đầu tiên Cuối cùng, sau khi khảo sát mọi cạnh rời u, các dòng 7- 8 sơn đen w và ghi nhận thời gian kết thúc trong ƒ [ul]

Đâu là thời gian thực hiện của DFS? Các vòng lặp trên các dòng 1-2 và các dòng 5-7 của DFS mất thời gian ©(V), khơng kể thời gian thi hành các lệnh gọi DFS-VISIT Thủ tục DFS-VISTIT được gọi chính xác một lần cho mỗi đỉnh ve V, bởi DEFS-VISIT chỉ được triệu gọi trên các đỉnh trắng và việc đầu tiên mà nó thực hiện đó là sơn xám đỉnh Trong khi thi hành DFS-VISIT(@), vòng lặp trên các dòng 3-6 được thi hành

|A4/tv]| lân Bởi >lA4tvl = 9),

vev

nên tổng mức hao phí thi hanh cdc dong 2-5 cia DFS-VISIT 14 O(E) Do đó, thời gian thực hiện cia DFS 14 O( V+ E)

Các tính chất của thuật toán tìm kiếm độ sâu đầu tiên

Tìm kiếm độ sâu đầu tiên mang lại nhiều thông tin về cấu trúc của một đồ thị Có lẽ tính chất cơ bản nhất của thuật toán tìm kiếm độ sâu

đầu tiên đó là đồ thị con phan tử tiền vị G, sẽ hình thành một rừng các

cây, bởi cấu trúc của các cây độ sâu đầu tiên chính xác soi gương cấu trúc của các lệnh gọi đệ quy của DFS-VISIT Nghĩa là, w = Z{+] nếu và chỉ nếu DES-VISIT@) đã được gọi trong một đợt tìm kiếm danh sách kể của w

Trang 21

538 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

Định lý 23.6 (Định lý dấu ngoặc đơn)

Trong mọi tìm kiếm độ sâu đầu tiên của một đổ thị (có hướng hoặc

không có hướng) Ở = (V, Ƒ), với bất kỳ hai đỉnh ¿ và w, chính xác sẽ có

một trong ba điều kiện dưới đây:

e các quãng [d[u], ƒ{w]] và {d[r], /Iv]] hoàn toàn rời nhau,

e quãng [Z[z], ƒ{⁄]] được chứa hoàn toàn trong quãng [av], f Ed),

và u la mét hau dué cia v trong cay d6 sau dau tién, hodc

e quãng [d[v]}, ƒ[+]] được chứa hoàn toàn trong quãng [đ[z»], ƒ[w]],

và v là một hậu duệ của uw trong cay độ sâu đầu tiên

Chứng mính Ta bắt đầu với trường hợp ở đó đ[w] < d[v] Có hai trường hợp con để xem xét, dẫu theo địv] < f [u] hay không Trong

trường hợp con đầu tiên, đ[v] < ƒ[z], do đó v đã được khám phá trong

khi ¿ vẫn còn xám Điều này hàm ý v là một hậu duệ của Hơn nữa,

bởi y đã được khám phá gần hơn ø, nên tất cả các cạnh đi ra củanó đều

được khảo sát, và v được hoàn tất, trước khi đợt tìm kiếm trả về và hoàn tất u Do đó, trong trường hợp này, quãng [d[v], f [v]] hoàn toàn nằm trong quãng [d[z], ƒ [w]] Trong trường hợp con thứ hai, ƒ [u] < đ[v], và

bất đẳng thức (23.1) hàm ý các quãng [đ{z],/[„]] và {[4[v], ƒ[v]] rời nhau

Trường hợp ở đó đ[v] < đ[w] cũng tương tự, với các vai trò của w và y được đảo ngược trong đối số trên đây

Hệ luận 23.7 (Lông ghép các quãng của các hậu duệ)

Đỉnh v là một hậu duệ riêng của đỉnh w trong rừng độ sâu đầu tiên

với một đồ thị Œ (có hướng hoặc không có hướng) nếu và chỉ nếu đ[r]

< dv] < flv] < flu]

Trang 22

23.3 Tìm biếm độ sâu đầu tiên 539 (a) wo be TT I 1 2 3 4 5 6 7 8 9 101112 13 14 15 l6 ($ (Œ (Œœ +) y) ẤP w) 2 3) CO Y fw» Ð (c)

Hình 23.5 Các tính chất của thuật toán tìm kiếm độ sâu đầu tiên (a) Kết quả của một đợt tìm kiếm độ sâu đầu tiên của một đồ thị có hướng Các đỉnh được

gán tem thời gian và các kiểu cạnh được nêu như trong Hình 23.4 (b) Các quãng cho thời gian khám phá và thời gian kết thúc của mỗi đỉnh tương ứng

với phép ngoặc đơn đã nêu Mỗi hình chữ nhật trải dài quãng của các thời gian khám phá và hoàn tất của đỉnh tương ứng Các cạnh cây được nêu Nếu

hai quãng phủ chồng, thì chúng sẽ long nhau, và đỉnh tưởng ứng với quãng nhỏ hơn sẽ là một hậu duệ của đỉnh tương ứng với quãng lớn hơn (c) Đồ thị của

Trang 23

540 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

Định lý dưới đây đưa ra một đặc trưng quan trọng khác về thời gian một đỉnh là một hậu duệ của một đỉnh khác trong rừng độ sâu đầu tiên

Định lý 23.8 (Định lý lộ trình trắng)

Trong một rừng độ sâu đầu tiên của một đề thị G = (V, E) (có hướng

hoặc không có hướng), đỉnh v là một hậu duệ của đỉnh u nếu và chỉ nếu vào thời gian ¿ [¿] mà đợt tìm kiếm khám phá u đỉnh v có thể đụng từ

u doc theo một lộ trình hoàn toàn bao gồm các đỉnh trắng

Chứng mình =: Giả sử v là một hậu duệ của u Cho w' là một đỉnh bất kỳ trên lộ trình giữa z và v trong cây độ sâu đầu tiên, sao cho w' là một

hậu duệ của u Theo Hệ luận 23.7, đ[w] < d[w'], và do đó w là trắng vào thời gian d[u]

©: Giả sử rằng đỉnh v khả đụng từ „ đọc theo một lộ trình các đỉnh trắng vào thời gian Z [w], nhưng v không trở thành một hậu duệ của

trong cây độ sâu đầu tiên Không để mất tính tổng quát, ta mặc nhận

rằng mọi đỉnh khác dọc theo lộ trình đều trở thành một hậu duệ của wu (Bằng không, cho v là đỉnh sát nhất với z dọc theo lộ trình không trổ thành một hậu duệ của u.) Cho w là phần tử tiển vị của v trong lộ trình, sao cho w' là một hậu dué của (thực tế w và ø có thể là cùng một đỉnh) và, theo Hệ luận 23.7, ƒ[w] < ƒ[w] Lưu ý, v phải được khám phá sau khi u được khám phá, nhưng trước khi hoàn tất w Do đó, d[u] < d[v] </Im]

< f[uj Như vậy, Định lý 23.6 hàm ý rằng quãng [đ [vị], /ƒ{[x]] được chứa hoàn toàn trong quãng {đ {z], /{u]] Theo Hệ luận 23.7, cuối cùng v phải

là một hậu duệ của wu

Phân loại các cạnh

Một tính chất thú vị khác của thuật toán tìm kiếm độ sâu đầu tiên đó

là đợt tìm kiếm có thể được dùng để phân loại các cạnh của đồ thị nhập

liệu Ở = (V E) Kiểu phân loại cạnh này có thể được dùng để lượm lặt

thông tin quan trọng về một đồ thị Ví dụ, trong đoạn kế tiếp, ta sẽ thấy một đồ thị có hướng là phi chu trình nếu và chỉ nếu một đợt tìm kiếm độ

sâu đầu tiên không cho ra các cạnh “lùi” (Bổ để 23.10)

Ta có thể định nghĩa bốn kiểu cạnh theo dạng rừng độ sâu đầu tiên G„ được tạo bởi một đợt tìm kiếm độ sâu đầu tiên trên Ó

\ Các cạnh cây [tree edges] là các cạnh trong rừng độ sâu đầu tiên

'Ở„ Cạnh (w, v) là một cạnh cây nếu v được khám phá đầu tiên bằng

cách khảo sát cạnh (w, v)

2 Các cạnh lùi [back edges] là các cạnh ( w » ) nối một đỉnh „ với

Trang 24

23.3 Tim hiếm độ sâu đầu tiên ð41

3 Các cạnh tới {forward edges] là các cạnh phi cây (w v) nối một đỉnh w với một hậu duệ v trong một cây độ sâu đầu tiên

4 Các cạnh chéo là tất cả các cạnh khác Chúng có thể tiến giữa các đỉnh trong cùng cây độ sâu đầu tiên, miễn là một đỉnh không phải là

tiền bối của đỉnh kia, hoặc chúng có thể tiến giữa các đỉnh trong các cây

độ sâu đầu tiên khác nhau

Trong các Hình 23.4 và 23.5, các cạnh được gán nhãn để nêu rõ kiểu của chúng Hình 23.5(c) cũng nêu cách vẽ lại đổ thị của Hình 23.5(a) sao cho tất cả các cạnh tới và cạnh cây đổ đầu xuống trong một cây độ sâu đầu tiên và tất cả các cạnh lùi đi lên Mọi đỗ thị đều có thể vẽ lại theo cách này

Có thể sửa đổi thuật toán DFS để phân loại các cạnh khi nó gặp

chúng Ý tưởng chính đó là có thể phân loại mỗi cạnh (, v) theo màu của đỉnh v đã đụng khi cạnh được khảo sát lân đầu (ngoại trừ các cạnh tới và cạnh chéo không được phân biệt):

1 WHITE nêu rõ một cạnh cây, 2 GRAY nêu rõ một cạnh lùi, và

3 BLACK nêu rõ một cạnh chéo và cạnh tới

Trường hợp thứ nhất là tức thời từ định chuẩn của thuật toán Với

trường hợp thứ hai, ta nhận thấy các đỉnh xám luôn hình thành một xích

tuyến tính gồm các hậu duệ tương ứng với ngăn xếp các lần gọi DFS-

VISIT hoạt động; số lượng các đỉnh xám nhiều hơn một so với độ sâu trong rừng độ sâu đầu tiên của đỉnh mới được khám phá Việc kháo sát luôn tiến hành từ đỉnh xám sâu nhất, do đó cạnh đụng một đỉnh xám

khác sẽ đụng một tiễn bối Trường hợp thứ ba điều quản khổ năng còn

lại; nó có thể được chứng tổ một cạnh (w, v) như vậy là một cạnh tới nếu d{u] < d[y] và là một cạnh chéo nếu d[u] > d[y] (Xem Bai tập 23.3-4.)

Trong loại đồ thị không có hướng, có thể có một dạng mơ hồ nào đó

trong kiểu phân loại bởi (w, #) và (t, w) thực tế là cùng một cạnh Trong

trường hợp như vậy cạnh được phân loại dưới dạng kiểu đầu tiên trong danh sách phân loại được áp dụng Một cách tương tự (xem Bài tập

23.3-5) cạnh được phân loại theo bất kỳ hoặc (w, 1) hoặc G, 4) được

gap đầu tiên trong khi thí hành thuật toán

Giờ đây ta chứng tỏ các cạnh tới và cạnh chéo không bao giờ xảy ra trong một đợt tìm kiếm độ sâu đầu tiên của một để thị không có hướng

Dinh ly 23.9

Trong một đợt ủm kiếm độ sâu đầu tiên của một đồ thị không có hướng @ mọi cạnh của GŒ là một cạnh cây hoặc một cạnh lùi

Ñ

Trang 25

542 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

Chứng mình Cho (u, v) là một cạnh tùy ý của G, va khong làm mất tính tổng quát, ta giả sử rằng đ[¿] < d[v] Thì, » phải được khám phá và hoàn tất trước khi ta hoàn tất u, bởi y nằm trên danh sách kể của Nếu

canh (u, v) được khảo sát đầu tiên theo hướng từ đến v, thi (w, v) trở

thành một cạnh cây Nếu (w, v) được khảo sát đầu tiên theo hướng từ v đến „, thì (w, v) là một cạnh lùi, bởi uv van xám vào thời gian cạnh được khảo sát lần đầu tiên

Ta sẽ thấy nhiều ứng dụng của các định lý này trong các đoạn sau

Hình 23.6 Một đồ thị có hướng để dùng trong Bài tập 23.3-2 và 23.5-2 Bài tập

23.3-1

Tạo một để thị 3 x 3 có các nhãn hang va c6t WHITE, GRAY, và

BLACK Trong mỗi ô (¡, j), nêu rõ tại một điểm bất kỳ trong một đợt tìm kiếm độ sâu đầu tiên của một đồ thị có hướng, có thể có một cạnh từ một đỉnh của màu ¿ đến một đỉnh của màu / hay không Với mỗi cạnh khả dĩ, hãy nêu rõ nó có thể có những kiểu cạnh nào Tạo một đồ thị thứ hai như vậy cho đợt tìm kiếm độ sâu đầu tiên của một đồ thị không có hướng

23.3-2

Trang 26

23.3 Tim kiếm độ sáu đầu tiên 543 đ một cạnh cây hoặc cạnh tới nếu và chỉ nếu đ[u] < d[v] < fb] <f Led,

b một cạnh lùi nếu và chỉ nếu ¿[+] < đ[z] < 1z] < ƒIv], và c một cạnh chéo néu va chi néu d[v] < f[v] < du] <f ful

23.3-5

Chứng tỏ trong một đồ thị không có hướng, khi một cạnh cây (u, v)

hoặc một cạnh lùi theo (w, v) hoặc (r, w) được gặp đầu tiên trong đợt tìm

kiếm độ sâu đầu tiên, việc phân loại một cạnh tương đương với việc phân loại nó theo mức ưu tiên của các kiểu trong lược đô phân loại

23.3-6

Nêu một ví dụ ngược lại với giả định rằng nếu có một lộ trình từ w đến v trong một đề thị có hướng G, và nếu đ [z] < đ [v ] trong một đợt tìm kiếm độ sâu đầu tién cla G, thi y là một hậu duệ của u trong rừng độ sâu đầu tiên được tạo

23.3-7

Sửa đổi mã giả cho thuật toán tìm kiếm độ sâu đầu tiên sao cho nó in ra mọi cạnh trong đổ thị có hướng Œ, chung với kiểu của nó Nêu các sửa đối nếu có, phải được thực hiện nếu Œ không có hướng

23.3-8

Giải thích cách kết thúc khả đĩ của một đỉnh của một để thị có hướng trong một cây độ sâu đầu tiên chứa chỉ w, cho dù „ đều có cả các cạnh vào và ra trong G,

23.3-9

Chứng tỏ một tìm kiếm độ sâu đầu tiên của một đồ thị không có

hướng G có thể được dùng để định danh các thành phần liên thông của Ớ, và rừng độ sâu đầu tiên chứa số lượng cây ngang bằng với G có các thành phần liên thông Nói một cách chính xác hơn, nêu cách sửa đổi thuật toán tìm kiếm độ sâu đầu tiên sao cho mỗi đỉnh v được gần một nhãn số nguyên cc[+] giữa Ì và &, ở đó & là số lượng các thành phần liên

thông của Ở sao cho cc[w#] = cc]] nếu và chỉ nếu w va vy nim 1 trong cùng

thành phần liên thông

23.3-10%

Một đề thị có hướng G = (V, E) duge néi don lé n€u uw ~> hầm ý có

tối đa một lộ trình đơn giản ura dén v vdi titcd cdc dinh uve V Néu

một thuật toán hiệu qua để xác định một để thị có hướng có được nối

Trang 27

544 Chương 23 Các Thuật Tốn Đơ Thị Căn Bản 23.4 (a) (>) Sắp xếp theo tôpô

Đoạn này nêu cách dùng thuật toán tìm kiếm độ sâu đầu tiên để thực hiện các đợt sắp xếp tôpô của đồ thị phi chu trình có hướng [di- rected acyclic graphs] hoặc như trong tiếng Anh thường gọi tắt là "dag.”

Một đợi sắp xếp tôpô của một dag G = (V, FE) là một kiểu sắp xếp thứ tự

tuyến tính tất cả các đỉnh củanó sao cho nếu GŒ chứa một cạnh (w, +), thì

w xuất hiện trước v trong tiến trình sắp xếp thứ tự (Nếu đỗ thị không

phải phi chu trình, thì không thể có cách sắp xếp thứ tự tuyến tính.) Một đợt sắp xếp tôpô của một đồ thị có thể được xem như một tiến trình sắp xếp thứ tự các đỉnh củanó dọc theo một đường ngang sao cho tất cả các cạnh có hướng đi từ trái qua phải Như vậy, sắp xếp tôpô khác với kiểu “sắp xếp” bình thường đã nghiên cứu trong Phần II

Đổ thi phi chu trình có hướng được dùng trong nhiều ứng dụng để

nêu rõ các mức ưu tiên giữa các sự kiện Hình 23.7 có nêu một ví dụ

nảy sinh khi Giáo sư Bumstead mặc đồ vào buổi sáng Giáo sư phải mặc

một số đổ mặc trước các đồ khác (ví dụ, mang vớ trước xỏ giày) Các mục khác có thể mặc theo thứ tự bất kỳ (ví đụ, vớ và quần dài) Một cạnh có hướng (w v) trong dag của Hình 23.7(a) nêu rõ dổ mặc ø phải

được mặc trước đổ v Do đó một đợt sắp xếp tôpô của dag này cho ta một thứ tự về mặc đổ Hình 23.7(b) nêu dag được sắp xếp theo tôpô

dưới dạng một tiến trình sắp xếp các đỉnh dọc theo một đường ngang

sao cho tất cẩ các cạnh có hướng đi từ trái qua phải 1116 17/18 9/10 1215 13/14 1⁄8 of? 2/5 3⁄4 11/18 tỰI6 1245 13/14 9/10 1⁄8 of 2⁄4 3/4

Hình 23.7 (a) Giáo sư Bumstcad sắp xếp theo tôpô quần áo của mình khi mặc

đồ Mỗi cạnh có hướng (w +) có nghĩa là đỏ mặc # phải được mặc trước để +

Thời gian khám phá và hoàn tất từ một đợt âm kiếm độ sâu đầu tiên được nều cạnh mỗi đỉnh (b) Cùng đề thị được nêu dưới dang đã sắp xếp theo tônô, Các đỉnh của nó được dàn xếp từ trái qua phải theo thứ tự thời gian kết thúc giảm

Trang 28

23.4 Sdp xép theo tépd 545

Thuật toán đơn giản dưới đây sắp xếp một đồ thị phi chu trình có

hướng theo tôpô

TOPOLOGICAL.-SORT (G)

1 gọi DFS(G) để tính tốn các thời gian hồn tất ƒ [v] cho mỗi đỉnh y 2 khi từng đỉnh hoàn tất, chèn nó vào trước một danh sách nối kết 3 trả về [return] danh sách nết kết các đỉnh

Ta có thể thực hiện một đợt sắp xếp tôpô trong thời gian Ø( V + E), bởi thuật toán tìm kiếm độ sâu đầu tiên kéo dài ©( V + E) thời gian và mất Ó(1) thời gian để chèn từng đỉnh |V | lên đầu danh sách nối kết

Ta chứng minh tính đúng đắn của thuật toán này bằng bổ để chính sau đây mô tả đặc điểm của đỗ thị phi chu trình có hướng

Bổ đề 23.10

Một đồ thị có hướng G là phi chu trình nếu và chỉ nếu một đợt tìm

kiếm độ sâu đầu tiên của Œ không cho ra cạnh lùi nào

Chứng minh —: Giả sử rằng có một cạnh lùi (u, v) Thì, đỉnh y là một tiền bối của đỉnh w trong rừng độ sâu đầu tiên Như vậy, ta có một lộ trình từ v đến ø trong Ớ, và cạnh lùi (w, v) hoàn tất một chu trình

Hình 23.8 Một dag cho kiểu sắp xếp tơpơ

«: Giả sử G chứa một chu trình c Ta chứng tỏ một đợt tìm kiếm độ sâu đầu tiên của Ớ cho ra một cạnh lùi Cho v là đỉnh đầu tiên được khám phá trong c, và cho (w, v) là cạnh đứng trước trong c Vào thời gian đ[v], ta có một lộ trình các đỉnh trắng từ v sang u Theo dinh lý lộ trình

trắng, đỉnh uw trở thành một hậu duệ của v trong rừng độ sâu đầu tiên Do

đó, (w, v) là một cạnh lùi

Định lý 23.11

TOPOLOGICAL-SORT(G) tao mét đợt sắp xếp tôpô của một đề thị

phi chu trình có hướng Ở

Chứng mình Giả sử DES chạy trên một dag đã cho G = (V, E) để xác định các thời gian hoàn tất cho các đỉnh của nó Ta chỉ cần chứng tổ với

Trang 29

546 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

một cặp các đỉnh riêng biệt w, w 6 V bất kỳ, nếu có một cạnh trong Ở từ u đến v, thì ƒ[v] < ƒ[n] Xét bất kỳ cạnh (, ») nào được DFS(G) khảo sát

Khi cạnh này được khảo sát, » không thể là xám, bởi v sẽ là một tiền

bối của w và (u, v) sẽ là một cạnh lùi, mâu thuẫn với Bổ dé 23.10 Do đó, v phải là trắng hoặc đen Nếu v là trắng, nó trở thành một hậu duệ của u, va do do ƒ [v] < ƒ[u] Nếu v là đen, thì ƒ[v] < ƒ[z] Như Vậy, với m6t canh (u, v) trong dag, ta có ƒ[v] < ƒ[z], đồng thời chứng minh định lý

Bài tập 23.4-I

Nêu cách sắp xếp thứ tự các đỉnh đo TOPOLOGICAL-SORT tạo ra khi nó chạy trên dag của Hình 23.8

23.4-2

Có nhiều cách sắp xếp khác nhau đối với các đỉnh của một đô thị có hướng G là các kiểu sắp xếp tôpô của Œ TOPOLOGICAL-SORT tạo ra cách sắp xếp thứ tự nghịch đảo với các thời gian hoàn tất độ sâu đâu

tiên Chứng tỏ không phải tất cả các đợt sắp xếp tôpô đều có thể được tạo ra theo cách này: ở đó tổn tại một đồ thị G sao cho TOPOLOGICAL-

SORT không thể tạo ra một trong các đợt sắp xếp tôpô của G, bất kể

gán cho G cấu trúc danh sách kể nào Cũng chứng tổ ở đó tên tại một

đồ thị mà hai phép biểu diễn danh sách kể riêng biệt đều cho ra cùng kiểu sắp xếp tôpô

23.4-3

Nêu một thuật toán xác định một đỗ thị không có hướng đã cho 6= (Y, E) có chứa một chu trình hay không Thuật toán của bạn phải chạy trong @(V) thời gian, độc lập với | E |

23.4-4

Chứng minh hoặc bác bỏ: Nếu một đề thị có hướng Œ chứa các chu trinh, thi TOPOLOGICAL-SORT(G) tạo ra một cách sắp xếp đỉnh giảm thiểu số lượng các cạnh "tôi” không nhất quán với cách sắp xếp thứ tự được tạo ra

23.4-5

Một cách khác để tiến hành sắp xếp tôpô trên một đỗ thị phi chu

Trang 30

23.5 Các thành phần liên thông mạnh 547

trình có hướng Ở = (V, E) đó là liên tục tìm một đỉnh của độ vào 0 kết xuất nó, gỡ bỏ nó cùng tất cả các cạnh ra củanó ra khỏi đô thị Giải thích cách thực thi ý tưởng này sao cho nó chạy trong thời gian Ó( V + E) Điều gì xẩy ra với thuật toán này nếu G có các chu trình?

23.5 Các thành phần liên thông mạnh

Giờ đây ta xét một ứng dụng cổ điển của thuật toán tìm kiếm độ sâu đầu tiên: phân tích một đồ thị có hướng thành các thành phần liên thông mạnh của nó Đoạn này sẽ trình bày cách thực hiện kiểu phân tích này bằng hai thuật toán tìm kiếm độ sâu đầu tiên Nhiều thuật toán làm việc

với đồ thị có hướng bắt đầu bằng một kiểu phân tích như vậy: cách tiếp

cận này thường cho phép chia bài toán ban đầu thành các bài toán con, mỗi bài dành cho một thành phần liên thông mạnh Tiến trình tổ hợp các giải pháp cho các bài toán con sẽ theo cấu trúc các tuyến nối giữa

các thành phần liên thông mạnh; có thể biểu diễn cấu trúc này bằng

một đồ thị có tên là đồ thị “thành phần,” được định nghĩa trong Bài tập

23.5-4

Hãy nhớ lại trong Chương 5 một thành phần liên thông mạnh của

một đồ thị có hướng G = (V, E) la một tập hợp cực đại các đỉnh U c V

sao cho với mọi cặp các đỉnh w và v trong Ù7, ta có cả w^¬» v lẫn + ^y ứ: nghĩa là, các đỉnh w và w là khả đụng với nhau Hình 23.9 có nêu một ví

dụ

Thuật toán của chúng ta để tìm các thành phần liên thông mạnh của một đồ thị G = (W, E) sử dụng phép chuyển vị của Ớ, được định nghĩa

trong Bai tap 23.1-3 là dé thi G' = ( V, E"), 6d6 E” = {(av):(, we E}

Nghia là, E" bao gồm các cạnh của G ma cdc huéng cia ching duoc

đảo ngược Cho một phép biểu diễn danh sách kể của G, thời gian để

Trang 31

548 Phần VI Thuật Toán Dé Thị (a) (b) (c)

Hình 23.9 (a) Một đồ thị có hướng GŒ Các thành phản hen thông mạnh của G

được nêu dưới dạng các vùng tô bóng Mỗi đỉnh được gán nhãn với các thời

gian khám phá và hoàn tất của nó Các cạnh cây được tô bóng (b) Đồ thị GT,

chuyển vị của G Cây độ sâu đầu tiên đã tính toán trong dòng 3 của STRONGLY-CONNECTED-COMPONENTS được nêu, với các cạnh cây được

tô bóng Mỗi thành phân liên thông mạnh tương Ứng với một cây độ sâu đầu

tiên Các đỉnh b, c, g, và h, được tô bóng đậm, là tổ tiên của mọi đỉnh trong

thành phân liên thông mạnh của chúng: các đỉnh này cũng là các gốc của các cây độ sâu-đẫu tiên mà đợt tìm kiếm độ sâu đầu tiên của GT tạo ra (c) Thành phan đồ thị G** phi chu trình có được nhờ rút gọn từng thành phần liên thông

mạnh của G thành mội đỉnh đơn lẻ

Thuật toán thời gian tuyến tính dưới đây (tức, ©(V + E) thời gian) sẽ tính các thành phần liên thông mạnh của một đồ thị có hướng Ở = (V, E) dùng hai đợt tìm kiếm độ sâu đầu tiên, một trên G và mot trén G"

STRONGLY-CONNECTED-COMPONENT'S (G)

1 goi DFS(G) dé tính toán các thời gian hoàn tất /[u] với mỗi đỉnh u 2 tính toán Œ

3 goi DFS(G"), nhung trong vòng lặp chính của DES, xét các đỉnh theo thứ tự giảm ƒ[„] (như đã tính toán trong dòng [)

4 kết xuất các đỉnh của mỗi cây trong rừng độ sâu đầu tiên của bước

Trang 32

Phân VI Thuật Tốn Đơ Thị 549

3 như một thành phần liên thông mạnh tách biệt

Thuật toán tìm đơn giản này dường như chẳng dính dáng gì với các thành phần liên thông mạnh Trong phần còn lại của đoạn này, ta vén màn bí mật của thiết kế và chứng minh tính đúng đắn củanó Ta bắt đầu bằng hai nhận xét hữu ích

Bổ đề 23.12

Nếu hai đỉnh nằm trong cùng thành phần liên thông mạnh, thì không bao giờ có lộ trình nào giữa chúng rời thành phần liên thông mạnh

Chứng mình Cho u và v là hai đỉnh trong cùng thành phần liên thông

mạnh Qua phần định nghĩa của thành phần liên thông mạnh, ta có các

lộ trình từ „ đến v và từ y đến u Cho đỉnh w nằm trên một lộ trình w ¬ » w^> y, Sao cho w khả đụng từ Hơn nữa, do có một lộ trình v ~> lu, ta biết z khả đụng từ w theo lộ trình w ^ » y ^ » w Do đó, w và w nằm trong cùng thành phần liên thông mạnh Bởi w được chọn một cách tùy ý, định lý được chứng minh

Định lý 23.13

Trong mọi đợt tìm kiếm độ sâu đầu tiên, tất cả ác đỉnh trong cùng

thành phần liên thông mạnh đều được đặt trong cùng cây độ sâu đầu

tiên

Chung minh Trong số các đỉnh trong thành phần liên thông mạnh, ta cho r là đỉnh đầu tiên được khám phá Do z là đầu tiên, nên các đỉnh khác trong thành phân liên thông mạnh là trắng vào lúc nó được khám

phá Ta có các lộ trình từ r đến mọi đỉnh khác trong thành phần liên

thông mạnh; do các lộ trình này không bao gi rời thành phần liên thông mạnh (theo Bổ để 23.12), tất cả các đỉnh trên chúng là trắng Như vậy, theo định lý lộ trình trắng, mọi đỉnh trong thành phần liên thông mạnh trở thành một hậu duệ của r trong cây độ sâu đầu tiên

Trong phần còn lại của đoạn này, các hệ ký hiệu đ[z] và ƒ[w] ám chỉ

các thời gian khám phá và hoàn tất như đã được tính toán bởi đợt tìm

kiếm độ sâu đầu tiên lần đầu trong dòng 1 của STRONGLY-CON-

NECTED-COMPONENTS Cũng vậy, hệ ký hiệu w ^ › » ám chỉ sự hiện

diện của một lộ trình trong Œ, chứ không phải trong G’

Để chứng minh STRONGL.Y-CONNECTED-COMPONENTS là đúng

đắn, ta giới thiệu khái niệm về £6 tién @(u) của một đỉnh „, là đỉnh w khả

đụng từ z¿ được hoàn tất cuối cùng trong đợt tìm kiếm độ sâu đầu tiên

của dòng l Nói cách khác,

Trang 33

550 Chương 23 Các Thuật Toán Đồ Thị Căn Bản [.ưu ý, @(¿) = w là khả dĩ bởi w 14 khả đụng từ chính nó, và do đó lu) <Š ƒ1#60]s (23.2) Cũng có thể chứng tổ @(@({u)) = @(u), theo biện luận đưới đây Với mọi đỉnh u, ve V, u, vhàm ý ƒ[@@)] < SIM], (23.3)

bởi {[w:v^» w} GÍw:w^> w} và tổ tiên có thời gian kết thúc cực đại của tất cả các đỉnh khả đụng Bởi p(w) la khả đụng từ ¡, công thức

(23.3) hàm ý ƒ{@(@(u))] < ƒ[#@(ø)] Ta cũng có ƒ[@(] < ƒ[@(662)], theo

bất đẳng thức (23.2) Nhu vay, f [¢(@(u))] = f [@(w)], va do đó ta có

$(@(u)) = @(u), bởi hai đỉnh hoàn tất tại cùng thời gian thực tế là cùng một đỉnh

Như sẽ thấy, mọi thành phần liên thông mạnh có một đỉnh là tổ tiên của mọi đỉnh trong thành phần liên thông mạnh; tổ tiên này là một “đỉnh đại diện” cho thành phần liên thông mạnh Trong đợt tim kiếm

độ sâu đầu tiên của G, nó là đỉnh đầu tiên của thành phần liên thông

mạnh được khám phá, và nó là đỉnh cuối của thành phần liên thông mạnh được hoàn tất Trong đợt tìm kiếm độ sâu đầu tiên của GT, nó là

gốc của một cây độ sâu đầu tiên Giờ đây ta chứng minh các tính chất

này

Định lý đầu tiên xác minh cách gọi @(u) là một “tổ tiên” của ư

Định lý 23.14

Trong một đồ thị có hướng G = (V, E), tổ tiên $(w) của một đỉnh u €

V trong mọi đợt tìm kiếm độ sâu đầu tiên của G chính là một tiền bối của u

Chứng mình Nếu @(u) = u, định lý đương nhiên là đúng Nếu u) #

u, ta hãy xét các màu của các đỉnh vào thời gian đ[z] Nếu @(u) là đen,

thì /{@(m)] </I=] mâu thuẫn với bất đẳng thức (23.2) Nếu đ(„) là xám,

thì nó là một tiền bối của z, và định lý được chứng minh

Như vậy ta chỉ cần chứng minh #(u) không trắng Có hai trường hợp, theo các màu của các đỉnh trung gian, nếu có, trên lộ trình từ w đến Hu) I Nếu mọi đỉnh trung gian là trắng, thì @(w) trở thành một hậu duệ của u, theo định lý lộ trình trắng Nhưng như vậy thì ƒ[@(w)]J < ƒ[»], mâu thuẫn với bất đẳng thức (23 2)

Trang 34

23.6 Các thành phần liên thông mạnh 551

và do đó $(„) là một hậu duệ của ¡ theo định ly lộ trình trắng Điều này hàm ý ƒ[r] > ƒ[@@z)], mâu thuẫn với sự chọn lựa của chúng ta về @(), bởi có một lộ trình từ „ đến ¿

Hệ luận 23.15

Trong mọi đợt tìm kiếm độ sâu đầu tiên của một dé thị có hướng Ở = (V, E), các đỉnh w và @(w), với tất cả u e V, nằm trong cùng thành phần liên thông mạnh

Chứng mình Ta có w ^ y 0(), theo định nghĩa về tổ tiên, và @(u) ¬ » u, bởi Ó() là một tiền bối của u

Định lý dưới đây cho ra một kết quả mạnh hơn liên kết các tổ tiên

với các thành phần liên thông mạnh

Định lý 23.16

Trong một đồ thị có hướng Ở = (V, E), hai đỉnh u, ve Vnim trong

cùng thành phần liên thông mạnh nếu và chỉ nếu chúng có cùng tổ tiên trong một đợi tìm kiếm độ sâu đầu tiên của G

Chứng mình —: Giả sử u và v nằm trong cùng thành phần liên thông mạnh Mọi đỉnh khả đụng từ z sẽ khả đụng từ v và ngược lại, bởi ta có các lộ trình trong cả hai hướng giữa „ và v Theo định nghĩa về tổ tiên, ta kết luận @(u) = ov)

©: Giả sử @) = @(y) Theo Hệ luận 23.15, „ nằm trong cùng thành

phần liên thông mạnh như (uw), và v nằm trong cùng thành phần liên thông mạnh như @(v) Do đó, w và v nằm trong cùng thành phần liên

thông mạnh ,

Với Định lý 23.16 trong tay, cấu trúc của thuật toin STRONGLY- CONNECTED-COMPONENTS có thể sáng tổ hơn Các thành phần liên thông mạnh là những tập hợp các đỉnh có cùng tổ tiên Hơn nữa, theo

Định lý 23.14 và định lý dấu ngoặc đơn (Định lý 23.6), trong đợt tìm

kiếm độ sâu đầu tiên trong dòng | cia STRONGLY-CONNECTED- COMPONENTS, một tổ tiên vừa là đỉnh đầu tiên đã khám phá vừa là đỉnh cuối hoàn tất trong thành phần liên thông mạnh củanó

Để hiểu tại sao ta chạy đợt tìm kiếm độ sâu đầu tiên trong dòng 3 của STRONGLY-CONNECTED-COMPONENTS trên ŒT, hãy xét đỉnh r có

thời gian kết thúc lớn nhất mà đợt tìm kiếm độ sâu đầu tiên trong dòng

I đã tính toán Theo định nghĩa về tổ tiên, đỉnh z phải là một tổ tiên, bởi

nó là tổ tiên của chính nó: nó có thể tự đụng, và không có đỉnh nào

trong đổ thị có một thời gian kết thúc cao hơn Đâu là các đỉnh khác trong thành phân liên thông mạnh của z? Chúng là những đỉnh có r làm

Trang 35

559_ Chương 33 Các Thuật Tốn Đơ Thị Căn Bản

đỉnh nào có một thời gian kết thúc lớn hơn ƒ [r] Nhưng thời gian kết thúc của z là cực đại của một đỉnh bất kỳ trong Œ; như vậy, thành phần liên thông mạnh một z đơn giản bao gồm những đỉnh có thể đụng r Một cách tương đương, ?hành phân liên thông mạnh của r bao gồm những đỉnh mà r có thể đụng trong GT Như vậy, đợt tìm kiếm độ sâu đầu tiên trong dòng 3 định danh tất cả các đỉnh trong thành phần liên

thông mạnh của r và tô đen chúng (Một đợt tìm kiếm độ rộng đầu tiên, hoặc bất kỳ đợt tìm kiếm các đỉnh khả đụng, có thể định danh tập hợp

này dễ dàng không kém.)

Sau khi đợt tìm kiếm độ sâu đầu tiên trong dòng 3 hoàn tất việc định danh thành phần liên thông mạnh của r, nó bắt đầu tại đỉnh ?' với thời

gian kết thúc lớn nhất của một đỉnh bất kỳ không nằm trong thành phần

liên thông mạnh của r Đỉnh r' phải là tổ tiên của riêng nó, bởi nó không thể đụng bất kỳ đỉnh nào có một thời gian kết thúc cao hơn

(bằng không, nó sẽ được gộp trong thành phần liên thông mạnh của ) Theo biện luận tương tự, bất kỳ đỉnh nào có thể đụng r'` chưa được tô

đen đều phải nằm trong thành phần liên thông mạnh của r’ Nhu vay,

khi đợt tìm kiếm độ sâu đầu tiên trong dòng 3 tiếp tục, nó định danh và

tô đen mọi đỉnh trong thành phần liên thông mạnh của r' bằng cách tìm từ r' trong GỚT

Như vậy, đợt tìm kiếm độ sâu đầu tiên trong dòng 3 sẽ lần lượt “lột” từng thành phần liên thông mạnh Mỗi thành phần được định danh trong dòng 7 của DES bằng một lệnh gọi DES-VISIT có tổ tiên của thành

phần đó làm đối số Các lệnh gọi đệ quy trong DFS-VISIT chung cuộc

sẽ tô đen từng đỉnh trong thành phần Khi DFS-VISIT trở về DFS, nguyên cả thành phần đã được tô đen và “lột.” Sau đó, DES tìm đỉnh có thời

gian kết thúc cực đại giữa các đỉnh chưa được tô đen; đỉnh này là tổ tiên

của một thành phần khác, và tiến trình tiếp tục Định lý dưới đây hình thức hóa đối số này

Định lý 23.17

STRONGLY-CONNECTED-COMPONENTS(Ø) tính toán đúng đắn

các thành phần liên thông mạnh của một đồ thị có hướng Ơ

Trang 36

238.5 Các thành phần liên thông mạnh 553

gì đáng nói, bởi với cây đầu tiên được tạo không có các cây trước đó, và do đó giả thiết này hiển nhiên là đúng

Xét một cây độ sâu đầu tiên 7 có gốc r được tạo trong đợt tìm kiếm độ sâu đầu của GT Cho C (z) thể hiện tập hợp các đỉnh có tổ tiên z:

C(n)={veV:0@)=r]

Giờ đây ta chứng minh một đỉnh được đặt trong 7 nếu và chỉ nếu

€ Cứ)

€: Dinh ly 23.13 him ý mọi đỉnh trong € (r) đều kết thúc trong cùng cây độ sâu đầu tiên Bởi re € (ứ) và r là gốc của 7, nên mọi thành phân của C (r) kết thúc trong T

=: Ta chứng tổ mọi đỉnh w sao cho ƒ[@(w)] > ƒ[r] hoặc ƒ[@(w)] < /[r] đều không được đặt trong 7, bằng cách xem xét hai trường hợp này tách biệt Theo phương pháp quy nạp trên số lượng các cây tìm thấy, bất kỳ đỉnh w nào sao cho /[@(w)] > ƒ [r] không được đặt trong cây 7, bởi vào thời gian mà r được chọn w tất đã được đặt trong cây có gốc ó(w) Bất kỳ đỉnh w nào sao cho ƒ [@(w)] < ƒ [r] đều không thể được đặt trong 7, bởi cách đặt như vậy hàm ý w ^¬.> r; như vậy, theo công thức (23.3) và tính

chat r = O(n), ta được ƒ[@(w)]> ƒ[@()] = / trl, mâu thuẫn với ƒ [@()] < fir)

Do đó, 7 chỉ chứa những dinh u ma $(u) = r Nghia 1a, T chinh xac

bằng với thành phần liên thông mạnh C (z) hoàn tất chứng minh quy

nạp Bài tập 23.3-1

Số lượng các thành phần liên thông mạnh của một đồ thị có thể thay đổi như thế nào nếu ta bổ sung một cạnh mới?

23.5-2

Nêu cách làm việc của thủ tục STRONGLY-CONNECTED-COMPO- NENTS trên đồ thị của Hình 23.6 Cụ thể, nêu các thời gian kết thúc đã tính toán trong dòng l và rừng được tạo trong dòng 3 Giả sử vòng lặp của các dòng 5-7 của DES xét các đỉnh theo thứ tự abc và các đanh sách kể theo thứ tự abc

23.5-3

Trang 37

554 Chương 23 Các Thuật Toán Đồ Thị Căn Bản

theo thứ tự các thời gian kết thúc răng dần Giáo sư có đúng không?

23.5-4

Ta thể hiện đồ thị thành phần của G = (V, E) bằng Œ%* = ( V*, E*), ở đó V** chứa một đỉnh cho mỗi thành phần liên thông mạnh của G va

E®* chứa cạnh (u, v) nếu có một cạnh có hướng từ một đỉnh trong thành

phần liên thông mạnh của G tương ứng với ¿ đến một đỉnh trong thành phần liên thông mạnh của Œ tương ứng với v Hình 23.9(c) nêu một ví

dụ Chứng minh GŒ** là một đồ thị phi chu trình có hướng [dag]

23.5-5

Nêu một thuật toán Ó(V + #) thời gian để tính toán đồ thị thành phần

của một đồ thị có hướng G = (V, E) Bảo đảm có tối đa một cạnh giữa hai

đỉnh trong đồ thị thành phần mà thuật toán của bạn tạo ra

23.5-6

Cho một đồ thị có hướng G = (V, E), giải thích cách tạo một đồ thị Œ'

= (V, E`) khác sao cho (a) Œ' có cùng các thành phần liên thông mạnh như G, (b) G” có cùng đồ thị thành phân như G, và (c) E" càng nhỏ càng tốt Mô tả một thuật toán nhanh để tính toán Œ'

23.5-7

Một đồ thị có hướng G = ( V, E) được xem là bán liên thông

[semiconnected] nếu, với bất kỳ hai đỉnh u, ve V, ta có u ¬^>»v hoặc y ^> w Nêu một thuật toán hiệu quả để xác định G có bán liên thông hay

khơng Chứng minh thuật tốn của bạn là đúng, và phân tích thời gian thực hiện của nó

Các Bài toán

23-I Phân loại các cạnh bằng thuật toán tìm kiếm độ rộng dầu tiên Một rừng độ sâu đầu tiên phân loại các cạnh của một đồ thị thành các cạnh cây, lùi, tới, và chéo Một cây độ rộng đầu tiên cũng có thể được dùng để phân loại các cạnh khả đụng từ nguồn của đợt tìm kiếm thành bốn phạm trù giống nhau

a Chứng minh trong một đợt tìm kiếm độ rộng đầu tiên của một đồ thị không có hướng, các tính chất dưới đây sẽ đứng vững:

Trang 38

Các Bài toán Chương 23 555

3 Với mỗi canh chéo (u, v), ta có đ[v] = đ[u] hoặc d[v] = d[m] + 1 b Chứng minh trong một đợt tìm kiếm độ rộng đầu tiên của một đi: thị có hướng, các tính chất dưới đây đứng vững:

1 Không có các cạnh tới

2 Với mỗi cạnh cay (uy, v), ta cé d[v] = d[u] + 1 3 Với mỗi cạnh chéo (w, v), ta có đ[v] < 4 [m] + 1 4 Với mỗi cạnh lùi (w, v), ta có 0 < dịy] < đ[u]

23-2 Các điểm khớp nối, các cầu nối, và các thành phần lưỡng thông

Cho G = ( V, E) là một đồ thị không có hướng, liên thông Một điểm

khớp nối [arculation point] của Ớ là một đỉnh mà việc gỡ bỏ nó sẽ làm gián đoạn GŒ Một cầu nốt [bridge] của G là một cạnh mà việc gỡ bỏ nó sẽ làm gián đoạn GŒ Một thành phần lưỡng thông [biconnected compo- nent] của G là một tập hợp cực đại các cạnh sao cho hai cạnh bất kỳ trong tập hợp nằm trên một chu trình đơn giản chung Hình 23.10 minh

họa các định nghĩa này Ta có thể xác định các điểm khớp nối, các cầu

nối, và các thành phân lưỡng thơng bằng thuật tốn tìm kiếm độ sâu

đầu tiên Cho G, = (V, E„) là một cây độ sâu đầu tiên của G

Hình 23.10 Các điểm khớp nối các cầu nối, và các thành phần lưỡng thông của một đề thị không có hướng liên thông, để dùng trong Bài toán 23-2 Các điểm khớp nối là các đỉnh tô bóng đậm, các cầu nối là các cạnh được tô bóng

đậm, và các thành phần lưỡng thông là các cạnh trong các vùng tô bóng, với

một kiểu đánh số bcc đã nêu

a Chứng minh gốc của Œ„ là một điểm khớp nối của Œ nếu và chỉ

nếu nó có ít nhất hai con trong Ớ,

b Cho v 1a một đỉnh phi gốc trong ỞƠ, Chứng mính v là một điểm khớp nối của G nếu và chỉ nếu không có cạnh lùi (w, w) nào sao cho

Trang 39

556 Chuong 23 Các Thuật Tốn Đơ Thị Căn Bản

div],

low[v] = min {d[w] : (u, w) 14 một cạnh lùi

với một hiu dué wu ctia vy}

Nêu cách tính /ow[v] với tất cả các đỉnh ve Vtrong O(E) thời gian

đ Nêu cách tính tất cả các điểm khớp nối trong Ø(Ƒ) thời gian

e Chứng minh một cạnh của G là một cầu nối nếu và chỉ nếu nó không nằm trên bất kỳ chu trình đơn giản nào của Ở

ƒ Nêu cách tính tất cả các cầu nối của G trong Ó(E) thời gian ø Chứng minh các thành phần lưỡng thông cla G phan hoạch các

cạnh phi cầu của Ở

b Nêu một thuật toán Ó(EF) thời gian gán nhãn mỗi cạnh e của G với

một số nguyên dương bcc[e] sao cho bcc[e] = bcc[z'] nếu và chỉ nếu e và e” nằm trong cùng thành phần lưỡng thông

23-3 Tua Euler

Một fa Euier của một đỗ thị có hướng, liên thông Ở = (V, £) là một

chu trình băng ngang mỗi cạnh của Œ chính xác một lần, mặc dù nó có

thể ghé một đỉnh nhiều lần

a Chứng tỏ G có một tua Euler nếu và chỉ nếu

độ vào@) = độ ra(v)

với mỗi đỉnh ve V,

b Mô tỉ một thuật toán Ó(E) thời gian để tìm một tua Euler của G

nếu tồn tại một tua như vậy (Mách nước: Hợp nhất các chu trình cạnh rời nhau.) Ghi chú Chương Even [65] va Tarjan [188] là các tham chiếu tuyệt vời về các thuật toán đồ thị

Thuật toán tìm kiếm độ rộng đầu tiên đã được Moore [150] khám phá trong ngữ cảnh tìm các lộ trình qua các mê cung Lee [134] đã độc lập khám phá cùng thuật toán trong ngữ cảnh định tuyến các dây dẫn trên các bo mạch

Hopcroft và Tarjan [102] đã ủng hộ cách dùng phép biểu diễn danh

sách kể so với phép biểu diễn ma trận kể với đồ thị thưa và là những

Trang 40

Ghi cht Chuang 23 557

kiếm độ sâu đầu tiên Tìm kiếm độ sâu đầu tiên đã được dùng rộng rãi vào cuối những năm 1950, nhất là trong các chương trình trí tuệ nhân tạo

Tarjan [185] đã cung cấp một thuật toán thời gian tuyến tính để tìm các thành phân liên thông mạnh Thuật toán về các thành phần liên

thông mạnh trong Đoạn 23.5 được thích ứng từ Aho, Hopcroft, va Ullman

Ngày đăng: 23/03/2022, 22:15

w