Untitled
unknown
c_cpp
2 years ago
2.3 kB
5
Indexable
#include "bits/stdc++.h" using namespace std; using ll = long long; using ull = unsigned long long; using db = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; using pdd = pair<db, db>; using tiii = tuple<int, int, int>; using str = string; #define vt vector #define pb push_back #define eb emplace_back #define ins insert #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) (int)x.size() #define mp make_pair #define mt make_tuple #define fi first #define se second constexpr int maxN = 100000; vt<int> graph[maxN], h(maxN), f(maxN); vt<bool> used1(maxN, false); set<pii> bridges; void dfs1(int u, int p = -1) { used1[u] = true; h[u] = f[u] = (p == -1 ? 0 : h[p] + 1); for (int &g : graph[u]) { if (g != p) { if (used1[g]) { f[u] = min(f[u], h[g]); } else { dfs1(g, u); f[u] = min(f[u], f[g]); if (h[u] < f[g]) { bridges.ins({u, g}); bridges.ins({g, u}); } } } } } vt<bool> used2(maxN, false); vt<int> nums(maxN); void dfs2(int u) { used2[u] = true; for (int &g : graph[u]) { if (!used2[g] && !bridges.count({u, g})) { nums[g] = nums[u]; dfs2(g); } } } void solve() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--; b--; graph[a].pb(b); graph[b].pb(a); } dfs1(0); int st = 0; for (int i = 0; i < n; i++) { if (!used2[i]) { nums[i] = st++; dfs2(i); } } vt<int> p(st); for (pii b : bridges) { int cmp1 = nums[b.fi], cmp2 = nums[b.se]; p[cmp1]++; p[cmp2]++; } int cnt = 0; for (int i = 0; i < st; i++) { if (p[i] == 2) cnt++; } cout << (cnt + 1) / 2; } signed main() { ios::sync_with_stdio(false); cin.tie(NULL); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int t = 1; // cin >> t; while (t--) { solve(); } return 0; }
Editor is loading...