This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub Luzhiled/syakyo-library
// verification-helper: PROBLEM https://judge.yosupo.jp/problem/scc #include "src/cpp-template/header/size-alias.hpp" #include "src/graph/decomposition/strongly-connected-components.hpp" #include <iostream> #include <vector> namespace luz { void main_() { usize n, m; std::cin >> n >> m; SCCGraph g(n); while (m--) { usize u, v; std::cin >> u >> v; g.add_directed_edge(u, v); } auto groups = g.get_scc_list(); std::cout << groups.size() << std::endl; for (auto& group: groups) { std::cout << group.size(); for (auto &v: group) { std::cout << " " << v; } std::cout << std::endl; } } } // namespace luz int main() { luz::main_(); }
#line 1 "test/library-checker/scc.test.cpp" // verification-helper: PROBLEM https://judge.yosupo.jp/problem/scc #line 2 "src/cpp-template/header/size-alias.hpp" #include <cstddef> namespace luz { using isize = std::ptrdiff_t; using usize = std::size_t; } #line 2 "src/graph/decomposition/strongly-connected-components.hpp" #include <vector> #line 5 "src/graph/decomposition/strongly-connected-components.hpp" namespace luz { struct SCCGraph { using usize = std::size_t; using graph = std::vector< std::vector< usize > >; usize n; graph g; std::vector< usize > S, B, I; void dfs(usize v, graph &scc) { B.emplace_back(I[v] = S.size()); S.emplace_back(v); for (auto u: g[v]) { if (I[u]) { while (I[u] < B.back()) B.pop_back(); } else { dfs(u, scc); } } if (I[v] != B.back()) return; scc.emplace_back(); B.pop_back(); while (I[v] < S.size()) { scc.back().emplace_back(S.back()); I[S.back()] = n + scc.size(); S.pop_back(); } } public: SCCGraph(usize n) : n(n), g(n) {} void add_directed_edge(usize from, usize to) { g[from].emplace_back(to); } graph get_scc_list() { graph scc; I.assign(n, 0); S = B = {}; for (usize v = 0; v < n; v++) { if (not I[v]) dfs(v, scc); } return {scc.rbegin(), scc.rend()}; } }; } // namespace luz #line 5 "test/library-checker/scc.test.cpp" #include <iostream> #line 8 "test/library-checker/scc.test.cpp" namespace luz { void main_() { usize n, m; std::cin >> n >> m; SCCGraph g(n); while (m--) { usize u, v; std::cin >> u >> v; g.add_directed_edge(u, v); } auto groups = g.get_scc_list(); std::cout << groups.size() << std::endl; for (auto& group: groups) { std::cout << group.size(); for (auto &v: group) { std::cout << " " << v; } std::cout << std::endl; } } } // namespace luz int main() { luz::main_(); }