#include "../util.h" struct edge { ll from, to, id; }; #define Edge edge #include #undef Edge vector naiveBridges(const vector>& edges) { vector res(sz(edges)); vector seen(sz(adj), -1); for (int i = 0; i < sz(edges); i++) { auto [a, b] = edges[i]; vector todo = {a}; seen[a] = i; while (!todo.empty() && seen[b] != i) { int c = todo.back(); todo.pop_back(); for (auto e : adj[c]) { if (e.id == i) continue; if (seen[e.to] == i) continue; seen[e.to] = i; todo.push_back(e.to); } } res[i] = seen[b] != i; } return res; } void stress_test_bridges() { ll queries = 0; for (int tries = 0; tries < 200'000; tries++) { int n = Random::integer(1, 30); int m = Random::integer(0, max(1, min(300, n*(n-1) / 2 + 1))); Graph g(n); g.erdosRenyi(m); adj.assign(n, {}); vector> edges; g.forEdges([&](int a, int b){ adj[a].push_back({a, b, sz(edges)}); adj[b].push_back({b, a, sz(edges)}); edges.emplace_back(a, b); }); auto expected = naiveBridges(edges); find(); vector got(sz(edges)); for (auto e : bridges) { if (got[e.id]) cerr << "error: duclicate" << FAIL; got[e.id] = true; } if (got != expected) cerr << "error" << FAIL; queries += n; } cerr << "tested random queries: " << queries << endl; } int main() { stress_test_bridges(); }