diff --git a/Luogu/P2860/P2860.cpp b/Luogu/P2860/P2860.cpp new file mode 100644 index 00000000..eb73295f --- /dev/null +++ b/Luogu/P2860/P2860.cpp @@ -0,0 +1,86 @@ +#include +#include +#include + +using std::cin; +using std::cout; +const char endl = '\n'; + +const int N = 5005, + M = 10005 << 1; + +int f, r, ans; +int idx, head[N], edge[N], next[N]; +int cnt, dfn[N], low[N]; +int dcc_cnt, siz[N], id[N], in[N]; +bool bridge[N]; +std::stack st; + +void add(int u, int v) { + next[idx] = head[u]; + edge[idx] = v; + head[u] = idx++; +} + +void tarjan(int u, int in_edge) { + dfn[u] = low[u] = ++cnt; + st.push(u); + + for (int i = head[u]; ~i; i = next[i]) { + int v = edge[i]; + + if (!dfn[v]) { + tarjan(v, i); + low[u] = std::min(low[u], low[v]); + + if (dfn[u] < low[v]) { + bridge[i] = bridge[i ^ 1] = true; + } + } else if (i != (in_edge ^ 1)) { + low[u] = std::min(low[u], dfn[v]); + } + } + + if (dfn[u] == low[u]) { + dcc_cnt++; + int v; + do { + v = st.top(); + st.pop(); + id[v] = dcc_cnt; + siz[dcc_cnt]++; + } while (v != u); + } +} + +int main() { + std::ios::sync_with_stdio(false); + cin.tie(nullptr); + + memset(head, 0xff, sizeof(head)); + + cin >> f >> r; + + for (int i = 1, u, v; i <= r; i++) { + cin >> u >> v; + + add(u, v); + add(v, u); + } + + tarjan(1, -1); + + for (int i = 0; i < idx; i++) { + if (bridge[i]) { + in[id[edge[i]]]++; + } + } + + for (int i = 1; i <= dcc_cnt; i++) { + if (in[i] == 1) ans++; + } + + cout << (ans + 1) / 2 << endl; + + return 0; +}