Tìm chu kỳ đơn giản trong đồ thị có hướng


15

Vấn đề này, đối với tôi, trông rất thú vị. Đó là về việc tìm một chu trình đơn giản (tức là chu kỳ không phải là các nút lặp lại) trong một biểu đồ có hướng.

Giải pháp của tôi là như thế này, tức là, biểu đồ này là một vấn đề trường hợp: nhập mô tả hình ảnh ở đây

Tôi biết rằng có một chu kỳ trong biểu đồ, khi bạn có thể tìm thấy "các cạnh sau" trong tìm kiếm theo chiều sâu (được hiển thị trong ảnh của tôi trong DFSTree) và trong một lúc, tôi có thể chắc chắn trong một vài chu kỳ, nhưng không phải cho tất cả, chu kỳ đơn giản. Bởi vì, các egdes được định hướng rất quan trọng đối với một chu kỳ, tức là (0123)! = (0321)

Tôi đang suy nghĩ về việc tạo một dfs cho mỗi nút có các cạnh sau, nhưng tôi không chắc, và nó không rõ ràng. Vì vậy, tôi hỏi bạn, nếu bạn hướng dẫn tôi. Cảm ơn!. nhập mô tả hình ảnh ở đây

Dưới đây là số vòng lặp đơn giản cho vấn đề trường hợp của tôi.

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


Câu trả lời:


13

Câu hỏi này dường như rất Googlizable. Ví dụ, bạn có thể quan tâm đến thuật toán được trình bày trong bài viết này:

Tìm tất cả các mạch cơ bản của đồ thị có hướng . Donald B. Johnson. SIAM J. MÁY TÍNH. Tập 4, số 1, tháng 3 năm 1975

Trừu tượng. Một thuật toán được trình bày trong đó tìm thấy tất cả các mạch cơ bản - của đồ thị có hướng trong thời gian giới hạn bởi O((n + e)(c + 1))và không gian giới hạn bởi O(n + e), nơi có ncác đỉnh, ecạnh và cmạch cơ bản trong biểu đồ. Thuật toán này giống với thuật toán của Tiernan và Tarjan, nhưng nhanh hơn vì nó xem xét mỗi cạnh nhiều nhất hai lần giữa bất kỳ một mạch và tiếp theo trong chuỗi đầu ra.

Bài viết chứa một thuật toán hoàn chỉnh.


Đồng ý. Bài viết rất hoàn hảo, nhưng tôi có thể đi đến bất cứ nơi nào với công việc của mình không, hay chỉ nhìn vào tờ giấy? Tôi đã tìm kiếm để bạn giới thiệu cho tôi giải pháp, tôi đang quên điều gì với ý tưởng của mình?
jonaprieto

2
Vấn đề chính của bạn là cây dfs không phải là duy nhất (ví dụ: hoán đổi "1" với "3" trong sơ đồ của bạn). Bạn sẽ cần phải xem xét tất cả các cây dfs có thể để liệt kê tất cả các chu kỳ.
badroit

1
Trong trường hợp bạn cần triển khai Java thuật toán này: github.com/1123/johnson
user52468

Liên kết @badroit bị hỏng ... :(
Jorge E. Hernández

@lalongooo, cảm ơn, tôi đã thay thế nó.
badroit
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.