#include #include #include enum Color { WHITE, GRAY, BLACK }; typedef int Node; typedef std::pair Edge; typedef std::vector> List; typedef std::vector Colors; int t = 0; void dfs(List& neigbours, Colors& color, std::vector& d, std::vector& low_link, std::vector& bridges, std::vector& pi, Node u) { t++; color[u] = GRAY; d[u] = t; low_link[u] = d[u]; for (int v : neigbours[u]) { if (color[v] == WHITE) { pi[v] = u; dfs(neigbours, color, d, low_link, bridges, pi, v); low_link[u] = std::min(low_link[u], low_link[v]); if (low_link[v] > d[u]) { bridges.push_back(std::make_pair(u, v)); } } else { if (pi[u] != v) { low_link[u] = std::min(low_link[u], d[v]); } } } color[u] = BLACK; } void bridges(List& neigbours) { const int n = neigbours.size(); Colors color(n, WHITE); std::vector bridges; std::vector low_link(n); std::vector d(n); std::vector pi(n, -1); dfs(neigbours, color, d, low_link, bridges, pi, 0); for (auto [u, v] : bridges) { std::cout << u << " " << v << std::endl; } } int main(void) { List neigbours = { {3}, {2, 3, 4}, {1, 5}, {0, 1, 4}, {1, 3}, {2} }; bridges(neigbours); return 0; }