Định nghĩa: Đặt là một DAG không có vòng lặp và và là đồ thị.
Input: . Đầu ra: Thành phần quan hệ Thành phần quan hệ trong .
- Trường hợp 1:. Hai vòng lặp cho và : Runtime .
- Trường hợp 2:
- Vẽ biểu đồ : . Chúng tôi gọi các cạnh từ đen và từ đỏ.
- Sắp xếp theo cấu trúc liên kết (Kahn: ). Đặt mức đầu tiên là và các cạnh đi từ cấp độ lên cấp độ cao hơn.
- Vẽ biểu đồ này hai lần.
- Trong bản sao đầu tiên, xóa mọi cạnh màu đỏ bắt đầu ở mức chẵn và mọi cạnh màu đen bắt đầu ở mức lẻ: .
- Trong bản sao thứ hai, xóa mọi "chẵn đen" và "lẻ đỏ": .
- Đối với bản sao đầu tiên:
- cho tất cả các nút trên cấp
- cho tất cả các nút trên cấp
- cạnh báo cáo (Thời gian chạy).
- Đối với bản sao thứ hai: Tương tự cho "".
- Liên kết các nút được báo cáo, loại bỏ các bản sao (Tôi hy vọng biểu diễn đồ thị cho phép điều này).
Một số bạn có thể vui lòng xem qua thuật toán của tôi và kiểm tra xem
- đúng rồi
- nó là trong
Nếu nó đúng, thuật toán của tôi đã "tồn tại" chưa? Nếu không, bạn có thể cung cấp một sự thay thế? Tôi sẽ chấp nhận câu trả lời đầu tiên, nhưng hãy ủng hộ nếu một số người khác rất tốt để kiểm tra.
EDIT: Bước 6 Có vẻ là trong đôi khi. Tôi ước điều này không thành sự thật. Có ai có một thuật toán làm việc?