33 _extendedDependsOn : []
44 _extendedRequiredBy : []
55 _extendedVerifiedWith :
6+ - icon : ' :heavy_check_mark:'
7+ path : test/strongly_connected_components.test.cpp
8+ title : test/strongly_connected_components.test.cpp
69 - icon : ' :heavy_check_mark:'
710 path : test/two_edge_connected_components.test.cpp
811 title : test/two_edge_connected_components.test.cpp
@@ -11,11 +14,11 @@ data:
1114 _verificationStatusIcon : ' :heavy_check_mark:'
1215 attributes :
1316 links : []
14- bundledCode : " #line 1 \" weilycoder/graph/tarjan.hpp\"\n\n\n\n #include <cstddef >\n \
15- #include <stack>\n #include <utility>\n #include <vector>\n\n namespace weilycoder \
16- \ {\n template <typename ptr_t = size_t> struct TwoEdgeConnectedComponents { \n \
17- \ ptr_t dfs_time = 0, edge_time = 1;\n\n std::vector<bool> in_stack;\n std::stack<ptr_t> \
18- \ stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<std::pair<ptr_t,\
17+ bundledCode : " #line 1 \" weilycoder/graph/tarjan.hpp\"\n\n\n\n #include <algorithm >\n \
18+ #include <cstddef> \n #include < stack>\n #include <utility>\n #include <vector>\n\n \
19+ namespace weilycoder {\n template <typename ptr_t = size_t> struct TwoEdgeConnectedComponents\
20+ \ { \n ptr_t dfs_time = 0, edge_time = 1;\n\n std::vector<bool> in_stack;\n \
21+ \ std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<std::pair<ptr_t,\
1922 \ ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>> eccs;\n\n TwoEdgeConnectedComponents(ptr_t\
2023 \ n)\n : in_stack(n, false), dfn(n, 0), low(n, 0), graph(n) {}\n\n void\
2124 \ add_edge(ptr_t u, ptr_t v) {\n graph[u].emplace_back(v, edge_time);\n \
@@ -29,12 +32,26 @@ data:
2932 \ = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\
3033 \ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\
3134 \ solve() {\n for (size_t i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n \
32- \ tarjan(i, 0);\n }\n };\n } // namespace weilycoder\n\n\n "
35+ \ tarjan(i, 0);\n }\n };\n\n template <typename ptr_t = size_t> struct StrongConnectedComponents\
36+ \ {\n ptr_t dfs_time = 0;\n\n std::vector<bool> in_stack;\n std::stack<ptr_t>\
37+ \ stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<ptr_t>> graph;\n \
38+ \n std::vector<std::vector<ptr_t>> sccs;\n\n StrongConnectedComponents(ptr_t\
39+ \ n)\n : in_stack(n, false), dfn(n, 0), low(n, 0), graph(n) {}\n\n void\
40+ \ add_edge(ptr_t u, ptr_t v) { graph[u].push_back(v); }\n\n void tarjan(ptr_t\
41+ \ u) {\n dfn[u] = low[u] = ++dfs_time;\n stk.push(u);\n in_stack[u] =\
42+ \ true;\n\n for (const auto &v : graph[u]) {\n if (!dfn[v])\n tarjan(v),\
43+ \ low[u] = std::min(low[u], low[v]);\n else if (in_stack[v])\n low[u]\
44+ \ = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u]) {\n sccs.emplace_back();\n \
45+ \ sccs.back().push_back(u);\n in_stack[u] = false;\n while (stk.top()\
46+ \ != u)\n sccs.back().push_back(stk.top()), in_stack[stk.top()] = false,\
47+ \ stk.pop();\n stk.pop();\n }\n }\n\n void solve() {\n for (size_t\
48+ \ i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n tarjan(i);\n std::reverse(sccs.begin(),\
49+ \ sccs.end());\n }\n };\n } // namespace weilycoder\n\n\n "
3350 code : " #ifndef WEILYCODER_TARJAN_HPP\n #define WEILYCODER_TARJAN_HPP\n\n #include\
34- \ <cstddef >\n #include <stack >\n #include <utility >\n #include <vector >\n\n namespace \
35- \ weilycoder {\n template <typename ptr_t = size_t> struct TwoEdgeConnectedComponents \
36- \ {\n ptr_t dfs_time = 0, edge_time = 1;\n\n std::vector<bool> in_stack; \n \
37- \ std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<std::pair<ptr_t,\
51+ \ <algorithm >\n #include <cstddef >\n #include <stack >\n #include <utility >\n #include \
52+ \ <vector> \n\n namespace weilycoder {\n template <typename ptr_t = size_t> struct\
53+ \ TwoEdgeConnectedComponents {\n ptr_t dfs_time = 0, edge_time = 1;\n\n std::vector<bool>\
54+ \ in_stack; \n std::stack<ptr_t> stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<std::pair<ptr_t,\
3855 \ ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>> eccs;\n\n TwoEdgeConnectedComponents(ptr_t\
3956 \ n)\n : in_stack(n, false), dfn(n, 0), low(n, 0), graph(n) {}\n\n void\
4057 \ add_edge(ptr_t u, ptr_t v) {\n graph[u].emplace_back(v, edge_time);\n \
@@ -48,15 +65,30 @@ data:
4865 \ = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\
4966 \ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\
5067 \ solve() {\n for (size_t i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n \
51- \ tarjan(i, 0);\n }\n };\n } // namespace weilycoder\n\n #endif\n "
68+ \ tarjan(i, 0);\n }\n };\n\n template <typename ptr_t = size_t> struct StrongConnectedComponents\
69+ \ {\n ptr_t dfs_time = 0;\n\n std::vector<bool> in_stack;\n std::stack<ptr_t>\
70+ \ stk;\n std::vector<ptr_t> dfn, low;\n std::vector<std::vector<ptr_t>> graph;\n \
71+ \n std::vector<std::vector<ptr_t>> sccs;\n\n StrongConnectedComponents(ptr_t\
72+ \ n)\n : in_stack(n, false), dfn(n, 0), low(n, 0), graph(n) {}\n\n void\
73+ \ add_edge(ptr_t u, ptr_t v) { graph[u].push_back(v); }\n\n void tarjan(ptr_t\
74+ \ u) {\n dfn[u] = low[u] = ++dfs_time;\n stk.push(u);\n in_stack[u] =\
75+ \ true;\n\n for (const auto &v : graph[u]) {\n if (!dfn[v])\n tarjan(v),\
76+ \ low[u] = std::min(low[u], low[v]);\n else if (in_stack[v])\n low[u]\
77+ \ = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u]) {\n sccs.emplace_back();\n \
78+ \ sccs.back().push_back(u);\n in_stack[u] = false;\n while (stk.top()\
79+ \ != u)\n sccs.back().push_back(stk.top()), in_stack[stk.top()] = false,\
80+ \ stk.pop();\n stk.pop();\n }\n }\n\n void solve() {\n for (size_t\
81+ \ i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n tarjan(i);\n std::reverse(sccs.begin(),\
82+ \ sccs.end());\n }\n };\n } // namespace weilycoder\n\n #endif\n "
5283 dependsOn : []
5384 isVerificationFile : false
5485 path : weilycoder/graph/tarjan.hpp
5586 requiredBy : []
56- timestamp : ' 2025-10-28 20:19:29 +08:00'
87+ timestamp : ' 2025-10-28 21:05:17 +08:00'
5788 verificationStatus : LIBRARY_ALL_AC
5889 verifiedWith :
5990 - test/two_edge_connected_components.test.cpp
91+ - test/strongly_connected_components.test.cpp
6092documentation_of : weilycoder/graph/tarjan.hpp
6193layout : document
6294redirect_from :
0 commit comments