Sự khác biệt giữa các cạnh chéo và cạnh phía trước trong DFT


11

Trong một cây sâu đầu tiên, có các cạnh xác định cây (tức là các cạnh đã được sử dụng trong giao dịch).

Có một số cạnh còn lại kết nối một số nút khác. Sự khác biệt giữa cạnh chéo và cạnh phía trước là gì?

Từ wikipedia:

Dựa trên cây bao trùm này, các cạnh của đồ thị ban đầu có thể được chia thành ba lớp: các cạnh chuyển tiếp, điểm từ một nút của cây đến một trong các hậu duệ của nó, các cạnh sau, điểm từ một nút đến một trong các tổ tiên của nó, và các cạnh chéo, mà không làm. Đôi khi các cạnh cây, các cạnh thuộc về cây bao trùm, được phân loại riêng biệt với các cạnh phía trước. Nếu đồ thị ban đầu là vô hướng thì tất cả các cạnh của nó là cạnh cây hoặc cạnh sau.

Không phải một cạnh không được sử dụng trong giao dịch trỏ từ nút này sang nút khác có thiết lập mối quan hệ cha-con không?


Liên quan: cs.stackexchange.com/questions/99988/ Quảng tìm cách thiết lập một thuật toán, đối với đồ thị có hướng, sẽ thích tạo các cạnh chuyển tiếp, thay vì các cạnh chéo, trong tìm kiếm theo chiều sâu.
pfalcon

Câu trả lời:


22

Wikipedia có câu trả lời:

nhập mô tả hình ảnh ở đây

Tất cả các loại cạnh xuất hiện trong hình ảnh này. Theo dõi DFS trên biểu đồ này (các nút được khám phá theo thứ tự số) và xem trực giác của bạn thất bại ở đâu.


Điều này sẽ giải thích sơ đồ: -

Chuyển tiếp cạnh: (u, v), trong đó v là hậu duệ của u, nhưng không phải là cạnh cây. Đây là cạnh không có cây nối liền một đỉnh với một hậu duệ trong cây DFS.

Cạnh chéo: bất kỳ cạnh khác. Có thể đi giữa các đỉnh trong cùng một cây sâu đầu tiên hoặc trong các cây sâu đầu tiên khác nhau. (layman)
Đó là bất kỳ cạnh nào khác trong đồ thị G. Nó kết nối các đỉnh trong hai cây DFS khác nhau hoặc hai đỉnh trong cùng một cây DFS không phải là tổ tiên của cây kia. (chính thức)


Tại sao 6 không phải là không thể đi qua đầu tiên (bên phải đầu tiên)? Nếu điều đó đã xảy ra, cạnh 2-> 3 sẽ được gọi là gì?
soandos

@soandos, tôi khuyên bạn nên dành thời gian để theo dõi thuật toán. Giả sử Wikipedian không phạm sai lầm, hình ảnh mô tả một hoạt động DFS thực sự trên biểu đồ này, và do đó, có một cách để phù hợp với thuật toán vào dấu vết này. Các loại cạnh được mô tả rõ ràng đủ trong Wikipedia và bạn cũng có thể tham khảo ví dụ này.
Yuval Filmus

Tôi hiểu rằng đây là một cách hợp lệ để thực hiện DFS. Tôi chỉ đơn giản là hỏi những gì nếu nó được thực hiện theo cách khác.
soandos

Sau đó, kết quả sẽ khác nhau. Tôi xin lỗi, bạn phải tự mình giải quyết.
Yuval Filmus

2
@soandos Nói chung, rất có thể có nhiều giao dịch DFS. Các khái niệm được sử dụng ở đây có liên quan đến một giao dịch đã cho và sẽ khác nhau cho nhiều giao dịch.
Raphael

9

Một giao dịch DFS trong đồ thị không được bảo vệ sẽ không để lại cạnh chéo vì tất cả các cạnh là sự cố trên một đỉnh được khám phá.

Tuy nhiên, trong biểu đồ có hướng, bạn có thể bắt gặp một cạnh dẫn đến một đỉnh đã được phát hiện trước đó để đỉnh đó không phải là tổ tiên hoặc hậu duệ của đỉnh hiện tại. Một cạnh như vậy được gọi là cạnh chéo.


Aporov, Cảm ơn bạn đã phản hồi. Dường như đối với tôi, khi bạn đến đỉnh 6 trong DFS như được sơ đồ hóa trong Wikipedia, bạn có ba cạnh để đi qua từ 6. Tại thời điểm đó, đỉnh 6 là "hiện tại". Cuối cùng, bạn sẽ đi qua cạnh tới đỉnh 3. Trong khi 3 đã được truy cập, tuy nhiên vì có một cạnh từ 6 đến 3, nhưng 3 là hậu duệ của đỉnh "hiện tại" 6. Nếu đó là như vậy, nó vi phạm định nghĩa của một cạnh chéo. Phải có một cái gì đó nhiều hơn cho định nghĩa không được làm rõ ràng.

Trong thực tế, DFS chỉ chứa một trong hai cạnh cây cho các cạnh sau (Giới thiệu về Thuật toán Thm. 22.10).
jrhee17

2

Trong một giao dịch DFS, các nút được hoàn thành sau khi tất cả các con của chúng kết thúc. Nếu bạn đánh dấu thời gian khám phá và kết thúc cho mỗi nút trong quá trình truyền tải, thì bạn có thể kiểm tra xem một nút có phải là hậu duệ hay không bằng cách so sánh thời gian bắt đầu và kết thúc. Trong thực tế, bất kỳ DFS traversal nào cũng sẽ phân vùng các cạnh của nó theo quy tắc sau.

Đặt d [nút] là thời gian khám phá của nút, tương tự, hãy để f [nút] là thời gian kết thúc.

Định lý ngoặc cho tất cả u, v, chính xác một trong các cách giữ sau:
1. d [u] <f [u] <d [v] <f [v] hoặc d [v] <f [v] <d [u ] <f [u] và cả u và v đều không phải là hậu duệ của người kia.

  1. d [u] <d [v] <f [v] <f [u] và v là hậu duệ của u.

  2. d [v] <d [u] <f [u] <f [v] và u là hậu duệ của v.

Vì vậy, d [u] <d [v] <f [u] <f [v] không thể xảy ra.
Giống như dấu ngoặc đơn: () [], ([]) và [()] là OK nhưng ([)] và [(]) không ổn.

Ví dụ: xem xét biểu đồ với các cạnh:
A -> B
A -> C
B -> C

Đặt thứ tự truy cập được biểu thị bằng một chuỗi các nhãn nút, trong đó "ABCCBA" có nghĩa là A -> B -> C (đã hoàn thành) B (đã hoàn thành) A (đã hoàn thành), tương tự như ((())).

Vì vậy, "ACCBBA" có thể là mô hình cho "(() ())".

Ví dụ:
"CCABBA": Khi đó A -> C là cạnh chéo, vì CC không nằm trong A.
"ABCCBA": Khi đó A -> C là cạnh tiến (hậu duệ gián tiếp).
"ACCBBA": Khi đó A -> C là cạnh cây (hậu duệ trực tiếp).

Nguồn:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure Ghi chú http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm

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.