Chúng ta cho rằng ứng dụng cổ điển về tìm kiếm theo chiều sâu: phân rã một đồ thị có hướng thành các thành phần liên thông mạnh. Phần này chỉ ra làm thế nào đối với sự phân rã này sử dụng phương pháp tìm kiếm theo chiều sâu. Có nhiều thuật toán làm việc với đồ thị có hướng bắt đầu với việc phân rã như vậy. Sau khi phân rã ra, thuật toán chạy đơn lẻ cho mỗi thành phần liên thông mạnh. Các cách giải quyết là kết hợp theo cấu trúc kết nối giữa các thành phần.
Nhắc lại từ phụ lục B rằng, một thành phần của một đồ thị vô hướng G=(V,E) là tập lớn nhất các đỉnh C⊆ V như là mỗi cặp đỉnh u và v trong C, chúng ta có đường đi từ u đến v và v đến u; điều đó có nghĩa u và v đến được với nhau. Hình 22.9 là một ví dụ.
(a) đồ thị vô hướng G. Các thành phần liên thông mạnh của G được chỉ ra bằng các vùng được tô bóng. Mỗi đỉnh được gán nhãn bằng thời gian tìm kiếm và kết thúc của nó. Các cạnh của cây được tô bóng.
(b) Đồ thị GT là chuyển vị của G. Rừng tìm kiếm theo chiều sâu được tính trong dòng 3 của STRONGLY-CONECTED-COMPONENTS cũng được thể hiện với các cạnh của 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 tìm kiếm theo chiều sâu. Đỉnh b, c, g và h, mà được tô rất đậm, là các gốc của các cây được tạo ra bởi tìm kiếm theo chiều sâu của GT
(c) Đồ thị thành phần không xoắn GSCC được lấy bằng cách co lại tất cả các cạnh bên trong mỗi thành phần liên thông mạnh của G vì thế chỉ một đỉnh đơn còn lại trong mỗi thành phần.
Thuật toán của chúng ta là tìm các thành phần liên thông mạnh của đồ thị G=(V,E) sử dụng sự chuyển đổi đồ thị G đã được xác định trong ví dụ 22.1-3 để trở thành đồ thị GT= (V,ET), mà ET= {(u,v): (v,u) ∈E} . Điều đó có nghĩa ET chứa các cạnh của G với hướng ngược lại. Cho một biểu diễn danh sách kề của G, thời gian để tạo ra GT là 0(V+E). Rất thú vị khi nhận thấy rằng G và GT có số thành phần liên thông như nhau: có cạnh từ u đến v và ngược lại trong G khi và chỉ khi chúng đi đến được nhau trong GT. Hình 22.9(b) chỉ rõ sự chuyển đổi của đồ thị hình 22.9 (a) với các thành phần liên thông mạnh được tô màu đậm (tô bóng).
Thuật toán thời gian tuyến tính sau đây tính các thành phần liên thông mạnh của đồ thị vô hướng G= (V,E) sử dụng hai lần phương pháp tìm kiếm theo chiều sâu, một trên G và một trên GT.
STRONGLY-CONECTED-COMPONENTS (G)
dòng 1 gọi DFS(G) để tính thời gian kết thúc f[u] cho mỗi đỉnh u dòng 2 tính toán GT
dòng 3 gọi DFS GT nhưng trong vòng lặp chính của DFS, xem các đỉnh là hợp lệ cho việc giảm f[u] ( như đã tính trong dòng 1)
dòng 4 dữ liệu ra các đỉnh của mỗi cây trong rừng cây duyệt theo chiều sâu được thiết lập ở dòng 3 là mỗi thành phần liên thông cách biệt.
Ý tưởng bên trong thuật toán này được bắt đầu từ tính chất khóa của thành phần đồ thị G= (VSCC , ESCC ), mà chúng ta định nghĩa như dưới đây. Cho rằng G có các thành phần liên thông mạnh C1, C2, ...Ck
Tập các đỉnh VSCC là {vk, v2, ...vk } và nó chứa một đỉnh vi cho mỗi thành phần liên thông mạnh. Có một cạnh (vi, vj) ∈ ESCC nếu G chứa một cạnh có hướng (x,y) cho một x ∈ Ci nào đó và cho một y ∈ Cj nào đó. Xem theo một hướng khác, bằng cách co tất cả các cạnh mà các cạnh phụ thuộc của nó là là ở trong cùng một thành phần liên thông, đồ thị kết quả là GSCC. Hình 22.9 (c) chỉ rõ đồ thị thành phần của đồ thị hình 22.9 (a)
Tính chất quan trọng ở đây là đồ thị thành phần này là một đồ thị vô hướng có chu trình , mà bổ đề dưới đây đề cập.
Bổ đề 22.13
Cho C và C′ là hai thành phần liên thông mạnh riêng biệt trong đồ thị có hướng G = (V,E), cho u, v ∈ C và u′, v′ ∈ C′ và giả thiết là có một đường đi từ u → u′
trong G. Lúc đó có thể không có đường đi từ v → v′
Chứng minh: Nếu trong G có một đường đi từ v′ đến v thì cũng có đường đi từ u → u′→ v′ và từ v′ → v→ u trong G. Như vậy u và v′ có thể đi đến được nhau, do đó trái với giả thiết la C và C′ là các thành phần liên thông phân biệt.
Ta sẽ thấy rằng bằng cách xem các đỉnh trong lần tìm kiếm theo chiều sâu thứ hai trong việc giảm bậc của thời gian kết thúc mà điều đó được tính trong lần tìm kiếm theo theo chiều sâu lần đầu. Đúng như bản chất chúng ta đang thăm các đỉnh của đồ thị thành phần (mà mỗi đồ thị tương ứng với một thành phần liên thông mạnh của G) trong thứ tự được sắp xếp tôpô.
Bởi vì các thành phần liên thông mạnh thực hiện 2 lần duyệt theo chiều sâu, có khả năng không rõ ràng khi chúng ta đề cập đên d[u] và f[u]. Trong phần này, các giá trị này luôn hướng đến sự phát hiện và thời gian kết thúc là được kết thúc vào lúc gọi DFS lần đầu tiên, trong line1.
Chúng ta mở rộng chú thích cho sự phát hiện và thời gian kết thúc đối với tập các đỉnh. Nếu U ⊆ V, thì chúng ta định nghĩa:
d(U)= minu∈U {d[u]} và f(U)= max u∈U {f[u]}
Điều này có nghĩa, d[U] và f[U] là thời gian tìm thấy sớm nhất và thời gian kết thúc trễ nhât theo thứ tự của các đỉnh bất của U.
Bổ đề tiếp theo và hệ quả của nó đưa ra các tính chất quan trọng liên quan đến các thành phần liên thông mạnh và thời gian kết thúc trong lần tìm kiếm theo chiều sâu đầu tiên.
Bổ đề 22.14.
Cho C và C′ là các thành phần liên thông mạnh phân biệt trong đồ thị vô hướng G= (V,E ). Giả sử có một cạnh (u,v )∈E, mà u∈ C và v∈ C′. Khi đó f(C) > f(C′) .
Chứng minh: Có hai trường hợp, phụ thuộc vào thành phần nào liên thông
mạnh, C hay C′, có các đỉnh phát hiện ra đầu tiên trong khi tìm kiếm theo chiều sâu lần đầu tiên.
Giả sử d(C) < d(C′), gọi x là đỉnh đầu tiên được tìm ra trong C. Lúc này d[x], tất cả các đỉnh trong C và C′ đều màu trắng. Có một đường đi trong G từ x đến mỗi đỉnh của C chỉ chứa các đỉnh màu trắng. Do (u,v) )∈E, đối với mỗi đỉnh bất kỳ u′∈ C′, cũng có một đường đôi khi d[x] từ x đến w trong G chỉ chứa các đỉnh trắng: x → u→ v→ w. Theo định lý đường đi trắng, tất cả các đỉnh trong C và C′
đều là đỉnh con của x trong cây duyệt sâu đầu tiên. Bằng hệ quả 22.8, f[x] = f[C] < f(C′).
Nếu thay thế, chúng ta có d(C) > d(C′), cho y là đỉnh đầu tiên được tìm thấy trong C′. Lúc đó d[y], tất cả các đỉnh của C′ là trắng và có một đường trong G từ y đến mỗi đỉnh trong C′ chỉ chứa các đỉnh trắng. Nhờ định lý đường đi trắng, tất cả các đỉnh trong C′ trở thành đỉnh con của y trong cây duyệt sâu đầu tiên. và bằng hệ quả 22.8, f[y] = f (C′). Lúc đó d[y], tất cả các đỉnh thuộc C là trắng. Vì vậy có một cạnh (u,v) từ C đến C′. Bổ đề 22.13 cho biết không thể có một đường đi từ C đến C’. Do đó không có đỉnh trong C có thể đến được từ y. Lúc đó f[y], nhờ thế, tất cả các đỉnh trong C vẫn là màu trắng. Do đó, đối với mọi đỉnh w ∈ C, ta có f[w] > f[y], mà điều đó có nghĩa là f(C) > f(C′)
Hệ quả dưới đây cho biết rằng, mỗi cạnh GT mà đi giữa các thành phần liên thông mạnh khác nhau đi từ thành phần có thời gian kết thúc sớm hơn ( trong lần duyệt sâu đầu tiên) đến thành phần với thời gian kết thúc trễ hơn.
Hệ quả 22.15
Cho C và C′; là các thành phần liên thông trong đồ thị vô hướng G = (V, E). Giả sử có một cạnh (u,v) ∈ ET, mà u ∈ C và v ∈ C′. Khi đó f(C) <f(C′).
Chứng minh:
Vì (u,v) ∈ ET chúng ta có (v,u) ∈ E. Vì các thành phần liên thông mạnh của G và GT là giống nhau, hệ quả 22.14 cho f(C) < f(C′)
Hệ quả 22.15 giúp chúng ta hiểu tại sao thủ tục STRONGLY-CONNECTED-
COMPONENTS làm việc. Chúng ta hãy thử nghiệm điều gì sẽ xảy ra khi chúng ta thực hiện tìm kiếm theo chiều sâu lần thứ hai trên GT. Chúng ta bắt đầu với thành phần liên thông mạnh C, có thời gian kết thúc là f(C) là lớn nhất. Việc tìm kiếm bắt đầu từ một đỉnh x nào đó, và nó thăm tất cả các đỉnh của C. Theo hệ quả 22.15, ở đó không có cạnh nào trong GT từ C đến bất kỳ thành phần liên thông mạnh nào
khác, và vì việc tìm kiếm từ x sẽ không thăm những đỉnh của C. Như thế, cây có gốc là x chứa chính xác các các đỉnh của C. Khi có sự hoàn thành thăm tất cả các đỉnh trong C, việc tìm kiếm ở dòng thứ 3 chọn một đỉnh như một gốc từ một thành phần liên thông mạnh C′ nào đó khác mà thời gian kết thúc f(C′) là lớn nhất trên tất cả các thành phần liên thông khác C. Một vấn đề nữa, việc tìm kiếm sẽ đi thăm tất cả các đỉnh của C′, nhưng theo hệ quả 22.15, chỉ có những cạnh trong GT từ C′ đến bất kỳ một thành phần khác phải đến C, mà chúng ta vừa thăm. Nói chung, khi tìm kiếm theo chiều sâu của GT ở dòng 3 ta thăm bất kỳ một thành phần liên thông mạnh nào đó, bất kỳ những cạnh nào nằm ngoài thành phần đó thì phải thuộc thành phần mà chúng ta đã thăm. Mỗi cây tìm tìm kiếm theo chiều sâu, vì vậy sẽ chính xác là một thành phần liên thông mạnh. Định lý tiếp theo đây thiết lập công thức cho lập luận trên.
Định lý 22.16 Các thành phần liên thông mạnh (G) được tính đúng bằng số
thành phần liên thông mạnh của đồ thị vô hướng G.
Chứng minh:
Chúng ta giải quyết bằng phương pháp quy nạp trên các cây tìm kiếm theo chiều sâu được tìm thấy trong cây tìm kiếm theo chiều sâu của GT ở dòng thứ 3 rằng các đỉnh của mỗi cây thiết lập hình thành một thành phần liên thông mạnh. Cơ sở của quy nạp, khi k=0 thì là trường hợp tầm thường.
Trong các bước quy nạp tiếp theo, chúng ta cho rằng những cây tìm kiếm theo chiều sâu thứ k được tạo ra theo dòng 3 là một thành phần liên thông mạnh, và chúng ta cho rằng cây tìm kiếm theo chiều sâu thứ k cũng được tạo ra. Gọi gốc của cây này là đỉnh u và đặt u trong thành phần liên thông mạnh C. Bởi vì làm cách nào chúng ta chọn gốc trong tìm kiếm theo chiều sâu ở dòng 3, chúng ta có f(u)=f(C) > f(C′) để bất kỳ một thành phần liên thông mạnh C′ nào đó khác C mà chúng ta còn phải thăm nó nữa. Bằng giả thiết quy nạp, tại thời điểm mà việc tìm kiếm thăm u, tất cả các đỉnh khác của C đều màu trắng. Bằng định lý đường đi trắng ta có tất cả các đỉnh của C đều là con của u trong cây tìm kiếm theo chiều sâu
của nó. Vì vậy, không có đỉnh nào trong bất kỳ thành phần liên thông mạnh nào khác C sẽ là hậu duệ của u trong việc tìm kiếm theo chiều sâu của GT. Do đó, các đỉnh của cây tìm kiếm theo chiều sâu trong GT mà có đỉnh đặt tại u được hình thành đúng bằng một thành phần liên thông mạnh mà nó được hoàn thiện bằng bước quy nạp và đó là điều phải chứng minh.
Có một cách khác để xem xét tìm kiếm theo chiều sâu lần thứ hai được thực hiện như thế nào. Cho đồ thị thành phần (GT)SCC của GT. Nếu chúng ta ánh xạ mỗi thành phần liên thông được thăm trong lần tìm kiếm theo chiều sâu lần thứ hai đối với một đỉnh của (GT)SCC thì các đỉnh của (GT)SCC được thăm bằng việc đảo ngược thứ tự được sắp xếp topo. Nếu chúng ta đảo các cạnh của (GT)SCC, chúng ta sẽ nhận được đồ thị ((GT)SCC)T. Bởi vì ((GT)SCC)T = GSCC (xem bài tập 22.5-4), việc tìm kiếm theo chiều sâu lần thứ hai thăm các đỉnh của GSCC theo thứ tự được sắp xếp tôpô.
BÀI TẬP 22.5.1 22.5.1
Số thành phần liên thông mạnh của đồ thị thay đổi thế nào nếu một cạnh mới được thêm vào?
22.5.2
Hãy chỉ ra thủ tục STRONGLY-CONNECTED-COMPONENTS làm việc trên đồ thị hình 22.6. Cụ thể, hãy chỉ thời gian kết thúc được tính ở dòng 1 và ở rừng được tạo thành ở dòng 3. Cho rằng vòng lặp của dòng 5-7 của DFS xem các đỉnh theo thứ tự alphabet và danh sách kề cũng được theo thứ tự alphabet.
22.5.3
Giáo sư Deaver cho là thuật toán đối với thành phần liên thông mạnh trở nên đơn giản hơn nếu dùng đồ thị nguyên bản (thay vì dùng đồ thị chuyển vị) trong lần duyệt theo chiều sâu thứ hai và quét các đỉnh theo thứ tự tăng thời gian kết thúc. Giáo sư nói có đún không?
22.5.4
Chứng minh rằng bất kỳ một đồ thị vô hướng G nào cũng có ((GT)SCC)T = GSCC. Điều đó có nghĩa chuyển vị của đồ thị thành phần của GT là giống như đồ thị thành phần của G.
22.5.5
Cho một 0(V+E) –thời gian thuật toán để tính đồ thị thành phần của đồ thị vô hướng G= (V, E). Chắc chắn rằng có một cạnh tốt nhất giữa hai đỉnh trong đồ thị thành phần của thuật toán của bạn sinh ra.
22.5.6
Cho một đồ thị vô hướng G= (V, E), hãy giải thích bằng cách nào để tạo ra đồ thị khác G′ = (V, E′) sao cho
a) G′ có cùng thành phần liên thông mạnh như G b) G′ có đồ thị thành phần như G
c) E′ là nhỏ nhất có thể
Mô tả một thuật toán nhau để tính G′
Một đồ thị vô hướng G= (V, E) được gọi là nửa liên thông nếu đối với mọi cặp đỉnh u, v ∈ V, chúng ta có đường đi từ u đến v và v đến u. Hãy đưa ra một thuật toán hiệu quả để xác định G có phải là nửa liên thông hay không? Chứng minh thuật toán của bạn là đúng và phân tích thời gian thực hiện nó.
BÀI TOÁN: