From ff4201b037c0e2a21761a87889ad96488ed14943 Mon Sep 17 00:00:00 2001 From: iagorrr04 Date: Wed, 20 Dec 2023 21:16:19 -0300 Subject: [PATCH] :white_check_mark: graphs, bridges --- submissions/CSES/Necessary Roads.cpp | 108 +++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 submissions/CSES/Necessary Roads.cpp diff --git a/submissions/CSES/Necessary Roads.cpp b/submissions/CSES/Necessary Roads.cpp new file mode 100644 index 00000000..9883a8d5 --- /dev/null +++ b/submissions/CSES/Necessary Roads.cpp @@ -0,0 +1,108 @@ +#include +using namespace std; +#ifdef LOCAL +#include "debug.cpp" +#else +#define dbg(...) 42 +#endif +#define endl '\n' +#define fastio \ + ios_base::sync_with_stdio(false); \ + cin.tie(0); \ + cout.tie(0); +#define len(__x) (int)__x.size() +using ll = long long; +using ull = unsigned long long; +using ld = long double; +using vll = vector; +using pll = pair; +using vll2d = vector; +using vi = vector; +using vi2d = vector; +using pii = pair; +using vii = vector; +using vc = vector; +#define all(a) a.begin(), a.end() +#define pb(___x) push_back(___x) +#define mp(___a, ___b) make_pair(___a, ___b) +#define eb(___x) emplace_back(___x) +int lg2(ll x) { + return __builtin_clzll(1) - __builtin_clzll(x); +} + +// vector dir({"LU", "U", "RU", "R", "RD", "D", +// "LD", "L"}); int dx[] = {-1, -1, -1, 0, 1, 1, 1, 0}; int +// dy[] = {-1, 0, 1, 1, 1, 0, -1, -1}; +vector dir({"U", "R", "D", "L"}); +int dx[] = {-1, 0, 1, 0}; +int dy[] = {0, 1, 0, -1}; + +const ll oo = 1e18; +int T(1); +const int MAXN(1'000'000); + +int tin[MAXN], low[MAXN], timer, N; +char vis[MAXN]; +vi2d G(MAXN); +vector bridges; + +void dfs(int u, int p = -1) { + vis[u] = true; + tin[u] = low[u] = timer++; + + for (auto v : G[u]) { + if (v == p) continue; + if (vis[v]) { + low[u] = min(low[u], tin[v]); + } else { + dfs(v, u); + low[u] = min(low[u], low[v]); + if (low[v] > tin[u]) { + bridges.emplace_back(u, v); + } + } + } +} +void findBridges() { + timer = 0; + + memset(vis, 0, sizeof(vis)); + memset(tin, -1, sizeof(tin)); + memset(low, -1, sizeof(low)); + bridges.clear(); + + for (int i = 0; i < N; i++) { + if (not vis[i]) dfs(i); + } +} + +int M; + +auto solve() { + cin >> N >> M; + while (M--) { + int u, v; + cin >> u >> v; + u--, v--; + G[u].emplace_back(v); + G[v].emplace_back(u); + } + + findBridges(); + cout << len(bridges) << endl; + for (auto &[a, b] : bridges) { + cout << a + 1 << ' ' << b + 1 << endl; + } +} + +int32_t main(void) { +#ifndef LOCAL + fastio; +#endif + + // cin >> T; + + for (int i = 1; i <= T; i++) { + solve(); + } +}