@@ -28,10 +28,11 @@ data:
2828 \ low[u] = std::min(low[u], low[v]);\n else if (in_stack[v])\n low[u]\
2929 \ = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u]) {\n sccs.emplace_back();\n \
3030 \ sccs.back().push_back(u);\n in_stack[u] = false;\n while (stk.top()\
31- \ != u)\n sccs.back().push_back(stk.top()), in_stack[stk.top()] = false,\
32- \ stk.pop();\n stk.pop();\n }\n }\n\n void solve() {\n for (size_t\
33- \ i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n tarjan(i);\n std::reverse(sccs.begin(),\
34- \ sccs.end());\n }\n };\n\n template <typename ptr_t = size_t> struct TwoEdgeConnectedComponents\
31+ \ != u)\n sccs.back().push_back(stk.top()), in_stack[stk.top()] = false,\n \
32+ \ stk.pop();\n stk.pop();\n }\n \
33+ \ }\n\n void solve() {\n for (size_t i = 0; i < graph.size(); ++i)\n \
34+ \ if (!dfn[i])\n tarjan(i);\n std::reverse(sccs.begin(), sccs.end());\n \
35+ \ }\n };\n\n template <typename ptr_t = size_t> struct TwoEdgeConnectedComponents\
3536 \ {\n ptr_t dfs_time = 0, edge_time = 1;\n\n std::vector<bool> in_stack;\n \
3637 \ std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<std::pair<ptr_t,\
3738 \ ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>> eccs;\n\n TwoEdgeConnectedComponents(ptr_t\
@@ -45,21 +46,22 @@ data:
4546 \ low[u] = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u])\
4647 \ {\n eccs.emplace_back();\n eccs.back().push_back(u);\n in_stack[u]\
4748 \ = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\
48- \ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\
49- \ solve() {\n for (size_t i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n \
50- \ tarjan(i, 0);\n }\n };\n\n template <typename ptr_t = size_t> struct BiconnectedComponents\
51- \ {\n ptr_t dfs_time = 0;\n\n std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn,\
52- \ low;\n std::vector<std::vector<ptr_t>> graph;\n\n std::vector<bool> is_cut;\n \
53- \ std::vector<std::vector<ptr_t>> dccs;\n\n BiconnectedComponents(ptr_t n) :\
54- \ dfn(n, 0), low(n, 0), graph(n), is_cut(n, false) {}\n\n void add_edge(ptr_t\
55- \ u, ptr_t v) {\n graph[u].push_back(v);\n graph[v].push_back(u);\n }\n \
56- \n void tarjan(ptr_t u, bool is_root) {\n dfn[u] = low[u] = ++dfs_time, stk.push(u);\n \
57- \n if (is_root && graph[u].empty()) {\n dccs.emplace_back();\n dccs.back().push_back(u);\n \
58- \ return;\n }\n\n ptr_t child = 0;\n for (const auto &v : graph[u])\
59- \ {\n if (!dfn[v]) {\n tarjan(v, false), low[u] = std::min(low[u],\
60- \ low[v]);\n if (low[v] >= dfn[u]) {\n if (++child > 1 || !is_root)\n \
61- \ is_cut[u] = true;\n dccs.emplace_back();\n do\n \
62- \ dccs.back().push_back(stk.top()), stk.pop();\n while (dccs.back().back()\
49+ \ in_stack[stk.top()] = false,\n stk.pop();\n \
50+ \ stk.pop();\n }\n }\n\n void solve() {\n for (size_t i = 0; i <\
51+ \ graph.size(); ++i)\n if (!dfn[i])\n tarjan(i, 0);\n }\n };\n\n template\
52+ \ <typename ptr_t = size_t> struct BiconnectedComponents {\n ptr_t dfs_time =\
53+ \ 0;\n\n std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<ptr_t>>\
54+ \ graph;\n\n std::vector<bool> is_cut;\n std::vector<std::vector<ptr_t>> dccs;\n \
55+ \n BiconnectedComponents(ptr_t n)\n : dfn(n, 0), low(n, 0), graph(n), is_cut(n,\
56+ \ false) {}\n\n void add_edge(ptr_t u, ptr_t v) {\n graph[u].push_back(v);\n \
57+ \ graph[v].push_back(u);\n }\n\n void tarjan(ptr_t u, bool is_root) {\n \
58+ \ dfn[u] = low[u] = ++dfs_time, stk.push(u);\n\n if (is_root && graph[u].empty())\
59+ \ {\n dccs.emplace_back();\n dccs.back().push_back(u);\n return;\n \
60+ \ }\n\n ptr_t child = 0;\n for (const auto &v : graph[u]) {\n if\
61+ \ (!dfn[v]) {\n tarjan(v, false), low[u] = std::min(low[u], low[v]);\n \
62+ \ if (low[v] >= dfn[u]) {\n if (++child > 1 || !is_root)\n \
63+ \ is_cut[u] = true;\n dccs.emplace_back();\n do\n \
64+ \ dccs.back().push_back(stk.top()), stk.pop();\n while (dccs.back().back()\
6365 \ != v);\n dccs.back().push_back(u);\n }\n } else\n \
6466 \ low[u] = std::min(low[u], dfn[v]);\n }\n }\n\n void solve() {\n for\
6567 \ (size_t i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n tarjan(i,\
8688 isVerificationFile : true
8789 path : test/strongly_connected_components.test.cpp
8890 requiredBy : []
89- timestamp : ' 2025-10-28 23:07:26 +08:00'
91+ timestamp : ' 2025-10-29 20:09:11 +08:00'
9092 verificationStatus : TEST_ACCEPTED
9193 verifiedWith : []
9294documentation_of : test/strongly_connected_components.test.cpp
0 commit comments