Thực tế là đồ thị của chúng tôi là chu kỳ làm cho vấn đề này đơn giản hơn nhiều.
Loại topo có thể cung cấp cho chúng tôi một Trật tự của các đỉnh như vậy mà, nếu i < j , sau đó không có cạnh từ v j trở lại v i . Chúng tôi đã liệt kê các đỉnh sao cho tất cả các cạnh đi "về phía trước" trong danh sách của chúng tôi.v1,v2,…,vni<jvjvi
(chỉnh sửa để sửa phân tích và đưa ra thuật toán nhanh hơn một chút)
Bây giờ chúng ta chỉ cần đi ngược qua danh sách này, bắt đầu từ đỉnh cuối cùng . đóng cửa bắc cầu của v n chỉ là chính nó. Ngoài ra, thêm v n vào bao đóng bắc cầu của mọi đỉnh có cạnh với v n .vnvnvnvn
Đối với các đỉnh , đi từ cuối trở về trước, trước tiên hãy thêm v i vào bao đóng bắc cầu của chính nó, sau đó thêm mọi thứ trong bao đóng bắc cầu của v i vào bao đóng bắc cầu của tất cả các đỉnh có cạnh với v i .vivivivi
Thời gian chạy là trong trường hợp xấu nhất, với n số đỉnh và m ∈ O ( n 2 ) số cạnh. Sắp xếp topo mất thời gian O ( n + m ) . Sau đó, chúng tôi thực hiện một công việc O ( m n ) khác trong đường chuyền ngược: Khi chúng tôi đi ngược qua danh sách, với mỗi cạnh, chúng tôi phải thêm tới nO(n+m+nm)=O(n3)nm∈O(n2)O(n+m)O(mn)n đỉnh để đóng cửa bắc cầu của ai đó.
Lưu ý rằng bạn có thể tăng tốc độ yếu tố không đổi tốt bằng cách biểu diễn việc đóng tạm thời của mọi người bằng các mảng bit. Giả sử bạn chỉ có ; sau đó bạn sẽ sử dụng một int 64 bit trong đó bit i là 1 nếu tôi ở trạng thái đóng bắc cầu và 0 nếu không. Sau đó, một phần, nơi chúng ta thêm tất cả mọi thứ trong tôi 's bắc cầu đóng cửa để j ' s thực sự là nhanh: Chúng tôi chỉ mất c j | = c i . (Hoạt động nhị phân HOẶC.)n=64iiijcjcTôi
Đối với , bạn phải giữ chúng trong mảng và thực hiện một số số học, nhưng nó sẽ nhanh hơn nhiều so với một bộ Object.n > 64
Ngoài ra, tôi biết big- trong trường hợp xấu nhất vẫn là O ( n 3 ) , nhưng để đánh bại điều này trong thực tế, bạn phải có một thứ gì đó phức tạp hơn nhiều. Thuật toán này cũng làm rất tốt trên các biểu đồ thưa thớt.ÔiÔ ( n3)