Đây là bài toán tìm cầu khớp cơ bản đầu tiên cần biết. Ý tưởng thuật toán như sau (nên xem thêm Tài liệu chuyên tin quyển 1): Bắt chước ý tưởng từ thuật toán Tarjan, gọi num[u] là số thứ tự đỉnh duyệt đến, low[u] là giá trị thứ tự nhỏ nhất mà trong cây DFS gốc u.
Tạo thêm mảng pa[u] là đỉnh cha của u trong khi duyệt, pa[u] = 0 khi u là chốt của cây DFS (đỉnh được duyệt đầu tiên).
Ta thực hiện định chiều DFS trong quá trình duyệt dfs tương tự thuật toán Tarjan. Bây giờ vấn đề đặt ra cạnh nào là cầu, đỉnh nào là khớp.
Với cầu: Giả sử với cạnh
(u,v)vớiulà cha trực tiếp củavtrong quá trình dfs (u = pa[v]). Nếu như từvtheo các cung đã định hướng, không có cách lên đượcuthì(u,v)là cầu của đồ thịlow[v] >= num[v]Với khớp: Xét hai trường hợp:
- Khi
ulà chốt của một cây DFS: (pa[u] = 0) nếu nó có hai nhánh con trong cây DFS đã định hướng thì khi hủy u sẽ tăng số TPLT =>ulà khớp - Khi
ukhông là chốt: (pa[u] > 0) Gọivlà đỉnh con củauthì nếu từvkhông có cách đi theo cung định hướng lên được các đỉnh trênuthìulúc này là khớplow[v] >= num[u]. (cách kiểm tra: duyệtv = 1->n, sau đó xétulàpa[v]).
- Khi