int cntdfs, dfs[MAXnd + 10], low[MAXnd + 10]; int cntcut; bitset<MAXeg * 2 + 10> iscut; voidTarjan(int cur, int fromedge){ dfs[cur] = low[cur] = ++cntdfs; for (int i = head[cur]; i; i = nex[i]) { if (i == (fromedge ^ 1)) continue; if (dfs[to[i]]) { low[cur] = min(low[cur], dfs[to[i]]); } else { Tarjan(to[i], i); low[cur] = min(low[cur], low[to[i]]); if (low[to[i]] > dfs[cur]) { ++cntcut; iscut[i] = iscut[i ^ 1] = 1; } } } } int cntdcc, indcc[MAXnd + 10]; voidEvaDcc(int cur){ indcc[cur] = cntdcc; for (int i = head[cur]; i; i = nex[i]) { if (indcc[to[i]] || iscut[i]) continue; EvaDcc(to[i]); } }
signedmain(){ // ...... for (int i = 1; i <= n; ++i) { if (!dfs[i]) { Tarjan(i, 0); } } for (int i = 1; i <= n; ++i) { if (!indcc[i]) { ++cntdcc; EvaDcc(i); } } }