Về khởi đầu: Đây là một vấn đề của cuộc thi lập trình, nhưng không phải từ một cuộc thi đang diễn ra. Thật không may, tôi không thể cung cấp bất kỳ liên kết nào đến nhiệm vụ này, vì nó không có sẵn công khai. Đó là từ một trong những cuộc thi lập trình địa phương của Ba Lan năm 2011 do Trường Khoa học Máy tính Warsaw tổ chức.
Tôi có một biểu đồ với các đỉnh không có cạnh và danh sách các cạnh . Trên -TH thứ hai cạnh -thứ đã được thêm vào một đồ thị. Tôi muốn biết sau giây nào sẽ có một chu kỳ trong biểu đồ.
Giải pháp rõ ràng nhất là thực hiện DFS sau khi thêm từng cạnh, nhưng sẽ mất thời gian . Một giải pháp khác là giữ cho đồ thị được sắp xếp theo cấu trúc liên kết và khi thêm một cạnh, tôi có thể đặt nó theo cách sao cho nó không làm xáo trộn trật tự tôpô. Điều này sẽ mất nhiều thời gian . Tôi đã thực hiện một số nghiên cứu trên Google và dường như đây là thuật toán trực tuyến nhanh nhất.
Theo tôi biết tất cả các cạnh trước đó tôi có thể sử dụng thuật toán ngoại tuyến. Thuật toán ngoại tuyến nhanh nhất tôi có thể nghĩ đến là tìm kiếm nhị phân. Nếu sau biểu đồ thứ hai thứ chứa một chu kỳ thì rõ ràng nó sẽ có một chu kỳ tại bất kỳ giây nào khác . Vì vậy, tôi có thể thực hiện tìm kiếm nhị phân để tìm nhỏ nhất bằng cách thực hiện DFS lần, mỗi lần lấy thời gian , do đó tổng độ phức tạp của giải pháp này sẽ là .
Nó khá nhanh, nhưng tôi tự hỏi liệu có tồn tại thuật toán ngoại tuyến nào nhanh hơn không. Một điều tôi có thể nghĩ đến là cho mỗi trọng lượng cạnh bằng với thời gian khi cạnh này được thêm vào biểu đồ. Sau đó, nhiệm vụ sẽ tương đương với việc tìm một chu kỳ với trọng lượng cạnh tối đa tối thiểu. Tôi không biết nếu nó dẫn đến bất cứ nơi nào.