Bài này ta cần chú ý là giữa 2 đỉnh có thể có nhiều hơn một đường đi.
Ngoài ra, chỉ cần duyệt như sau:
Với mỗi đỉnh \(u\), ta xét các đỉnh kề của \(u\) và xem trong các đỉnh kề đó
có 2 đỉnh nào cùng kề với một đỉnh khác \(u\) hay không, nếu có thì ta in
kết quả.
Độ phức tạp của thuật toán là \(O(m \times n)\), nhưng do ta sử dụng
cấu trúc bitset
nên thuật toán sẽ chạy trong thời gian cho phép. Trên thực tế, số thao tác
cần thực hiện khoảng \(m \times n / 64\).
Xem comment trong code để biết thêm chi tiết.
Ngoài ra còn có cách làm \(O(n^2)\) do một bạn đề xuất như sau:
Với mỗi đỉnh u từ 1 đến n, duyệt tất cả các cặp đỉnh (v1, v2) kề với u, nếu f[v1][v2] chưa
được đánh dấu thì tiến hành đánh dấu f[v1][v2], ngược lại thì ta tiến
hành duyệt một lần nữa để tìm lại đỉnh v đã đánh dấu f[v1][v2], khi
đó ta có chu trình u -> v1 -> v -> v2 -> u. Để tiết kiệm bộ nhớ thì ta
dùng bitset để biểu diễn f.
Tuy nhiên, với giới hạn của bài này thì cách làm \(O(mn)\) bên trên nhanh hơn.