Mục đích của nút màu xám trong tìm kiếm theo chiều sâu đồ thị


18

Trong nhiều triển khai tìm kiếm theo chiều sâu mà tôi thấy (ví dụ: ở đây ), mã phân biệt giữa một đỉnh màu xám (được phát hiện, nhưng không phải tất cả các hàng xóm của nó đã được truy cập) và một đỉnh đen (được phát hiện và tất cả các hàng xóm của nó đã được truy cập) . Mục đích của sự phân biệt này là gì? Có vẻ như thuật toán DFS sẽ không bao giờ truy cập vào một đỉnh được truy cập bất kể màu xám hay màu đen.

Câu trả lời:


25

Khi thực hiện một DFS, bất kỳ nút nào cũng thuộc một trong ba trạng thái - trước khi được truy cập, trong khi truy cập đệ quy con cháu của nó và sau khi tất cả các hậu duệ của nó đã được truy cập (trở về cha mẹ của nó, tức là giai đoạn kết thúc). Ba màu tương ứng với mỗi trong ba trạng thái. Một trong những lý do để đề cập đến màu sắc và thời gian truy cập và trở về là để làm rõ ràng những sự khác biệt này để hiểu rõ hơn.

Tất nhiên, có những sử dụng thực tế của những màu sắc này. Hãy xem xét một đồ thị có hướng . Giả sử bạn muốn kiểm tra G cho sự tồn tại của chu kỳ. Trong một đồ thị vô hướng, nếu nút đang xem xét có hàng xóm màu đen hoặc xám, nó chỉ ra một chu kỳ (và DFS không truy cập nó như bạn đã đề cập). Tuy nhiên, trong trường hợp đồ thị có hướng , hàng xóm màu đen không có nghĩa là một chu kỳ. Ví dụ, hãy xem xét một đồ thị với 3 đỉnh - Một , B ,C , với các cạnh đạo như Một B , B C , A C . Giả sử DFS bắt đầu tại AGGMột,B,CMộtBBCMộtCMột, Sau đó thăm , sau đó C . Khi nó trở về A , nó sẽ kiểm tra xem C đã được truy cập chưa và có màu đen không. Nhưng không có chu kỳ trong biểu đồ.BCMộtC

Trong biểu đồ có hướng, một chu kỳ có mặt khi và chỉ khi một nút được nhìn thấy lại trước khi tất cả các hậu duệ của nó được truy cập. Nói cách khác, nếu một nút có hàng xóm màu xám, thì có một chu kỳ (và không phải khi hàng xóm có màu đen). Một nút màu xám có nghĩa là chúng ta hiện đang khám phá hậu duệ của nó - và nếu một hậu duệ như vậy có một cạnh với nút màu xám này, thì có một chu kỳ. Vì vậy, để phát hiện chu kỳ trong đồ thị có hướng, bạn cần có 3 màu. Có thể có các ví dụ khác nữa, nhưng bạn nên lấy ý tưởng.


2
+1 giải thích tốt. Đối với giao dịch đơn giản của tất cả các nút trong biểu đồ không bị chặn (như liên kết trong thân câu hỏi của tôi), GRAY và BLACK có khác biệt về chức năng không?
dùng6805

1
@ user6805 Đối với giao dịch đơn giản - truy cập vào mọi nút - của cả đồ thị có hướng hoặc không có hướng, không có sự khác biệt về chức năng giữa màu xám và màu đen. Bạn chỉ có thể sử dụng hai màu (hoặc truy cập / không truy cập). Đó là cho các thuật toán phức tạp hơn mà bạn cần màu sắc.
Paresh

Tôi đã hiểu! OK, hãy xem xét trường hợp sau: twitter.com/MaksimADmitriev/status/796995958043279361 Chúng tôi duyệt qua các biểu đồ bằng DFS. Biểu đồ bên trái giống như biểu đồ từ câu trả lời này và nó không có chu kỳ. Hãy đi qua biểu đồ bên phải có chu kỳ. Chúng tôi ghé thăm A và đánh dấu nó màu xám. Chúng tôi ghé thăm B và đánh dấu nó màu xám. Chúng tôi ghé thăm C và đánh dấu nó màu xám. Bây giờ chúng tôi sắp đến thăm A vốn đã xám xịt. Vì vậy, "từ đen sang đen" không có nghĩa là có một chu kỳ, nhưng "từ xám sang xám" thì có. Đó là lý do tại sao chúng ta cần màu xám. Xin hãy sửa tôi nếu tôi sai
Maksim Dmitriev

Đối với các mục đích phức tạp hơn như tìm kiếm các thành phần được kết nối mạnh, người ta có thể cần ghi lại hai lần cho mỗi nút: thời gian trước khi tìm thấy nút đầu tiên (nghĩa là thời gian nó có màu xám) và thời gian sau khi nút được truy cập xong (tức là thời gian nó có màu đen). Để thực hiện ghi âm, một bộ đếm được duy trì, được tăng lên khi mỗi sự kiện xảy ra.
Giăng

2

Đây là một bài tập trong CLRS mà bạn có thể loại bỏ màu xám hoặc đen và thuật toán hoạt động tốt chỉ với hai màu, nói cách khác, nó không thực sự cần thiết. Mục tiêu chính của việc đánh dấu các đỉnh là để đảm bảo chúng ta không chạy vào một vòng lặp vô hạn bằng cách truy cập nhiều lần các đỉnh đã truy cập.

Lý do sử dụng 3 màu trong thuật toán DFS chủ yếu là sư phạm: nó rõ ràng hơn về mặt khái niệm, nó giúp sinh viên thấy những gì đang diễn ra trong quá trình thực hiện cho mỗi nút.


0

Đỉnh xám nói rằng bạn đã truy cập nút đó và chuyển sang một trong các lân cận của nó theo một số thứ tự, nhưng có thể có nhiều đỉnh lân cận hơn với nút đó. Nó rất hữu ích trong khi quay lại để khám phá các đỉnh không mong muốn.

Hãy nói rằng Vertex A có hai người hàng xóm B và C và B có một người hàng xóm D .

bắt đầu từ đỉnh A có màu trắng và làm cho nó có màu xám và đi qua hàng xóm của nó.

Hãy nói bằng cách chọn thứ tự chữ cái, nó truy cập đỉnh B có màu trắng và đánh dấu là màu xám.

Sau đó truy cập D của màu trắng -> màu xám D -> không có hàng xóm nữa. do đó đánh dấu D-> đen .

Bây giờ, quay lại B ở Grey và không còn bến cảng nữa. Do đó đánh dấu B-> đen .

Quay trở lại A màu xám và truy cập dấu c đến c-> Màu xám không có hàng xóm đánh dấu C là màu đen

cuối cùng, trở lại A và đánh dấu đỉnh A là màu đen vì không còn đỉnh trắng nào nữa và tất cả đều màu đen.


Tôi không thấy sự phân biệt giữa màu xám và màu đen có mục đích nào ở đây không ..
user6805

đó là những gì bạn phải hiểu. Nếu một đỉnh được đánh dấu là màu đen, điều đó có nghĩa là sẽ không có bất kỳ đỉnh lân cận nào với đỉnh đó. Ở đây đỉnh D được đánh dấu màu đen vì không có các đỉnh lân cận .. trong đó như màu xám cho thấy có nhiều hàng xóm đến thăm và do đó bạn đi qua các đỉnh đó.
NRK

Tôi tin rằng nó giúp bạn tiết kiệm từ việc truy cập lại các nút mà bạn biết chắc chắn không có cạnh sau (tức là tối ưu hóa)
Setheron

0

Trong DFS, chúng tôi phân loại các cạnh là cạnh trước, cạnh sau, cạnh chéo và cạnh cây.

Chúng tôi sử dụng 3 màu để phân loại các cạnh. và những màu này đại diện cho trạng thái của đỉnh tức là v. trắng: đỉnh v chưa được khám phá.

màu xám: v đã được phát hiện, nhưng tất cả các đỉnh có thể tiếp cận từ v vẫn chưa được khám phá. do đó đỉnh v vẫn nằm trong ngăn xếp.

màu đen: v đã bật ra khỏi stack.discovered và kết thúc.

Khi thực hiện DFS nếu bạn gặp một đỉnh màu xám qua cạnh e thì đó là cạnh sau. Nếu bạn gặp một đỉnh màu đen qua cạnh e thì đó là cạnh chéo / cạnh phía trước. nếu bạn gặp đỉnh trắng thì bạn sẽ gọi DFS theo cách đệ quy.


OK nhưng vấn đề là gì? Bạn đã nói rằng màu trắng / xám / đen có liên quan đến tiến / lùi / chéo / cây nhưng bạn cũng không nói những thứ đó để làm gì. Vì vậy, bây giờ có bảy điều người hỏi không hiểu, thay vì chỉ ba!
David Richerby

Các cạnh này có thể được sử dụng trong các ứng dụng khác nhau của DFS, như các cạnh sau được sử dụng để xác định các vòng lặp trong biểu đồ, Các cạnh chuyển tiếp và chéo được sử dụng để Kiểm tra xem có tồn tại đường dẫn duy nhất giữa mỗi cặp đỉnh hay không.
Neeraj Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.