|
| 1 | +--- |
| 2 | +data: |
| 3 | + _extendedDependsOn: [] |
| 4 | + _extendedRequiredBy: [] |
| 5 | + _extendedVerifiedWith: |
| 6 | + - icon: ':heavy_check_mark:' |
| 7 | + path: test/two_edge_connected_components.test.cpp |
| 8 | + title: test/two_edge_connected_components.test.cpp |
| 9 | + _isVerificationFailed: false |
| 10 | + _pathExtension: hpp |
| 11 | + _verificationStatusIcon: ':heavy_check_mark:' |
| 12 | + attributes: |
| 13 | + 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\nnamespace weilycoder\ |
| 16 | + \ {\ntemplate <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,\ |
| 19 | + \ ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>> eccs;\n\n TwoEdgeConnectedComponents(ptr_t\ |
| 20 | + \ n)\n : in_stack(n, false), dfn(n, 0), low(n, 0), graph(n) {}\n\n void\ |
| 21 | + \ add_edge(ptr_t u, ptr_t v) {\n graph[u].emplace_back(v, edge_time);\n \ |
| 22 | + \ graph[v].emplace_back(u, edge_time);\n edge_time++;\n }\n\n void tarjan(ptr_t\ |
| 23 | + \ u, ptr_t parent_edge) {\n dfn[u] = low[u] = ++dfs_time;\n stk.push(u);\n\ |
| 24 | + \ in_stack[u] = true;\n\n for (const auto &[v, edge_id] : graph[u]) {\n\ |
| 25 | + \ if (edge_id == parent_edge)\n continue;\n if (!dfn[v])\n \ |
| 26 | + \ tarjan(v, edge_id), low[u] = std::min(low[u], low[v]);\n else if (in_stack[v])\n\ |
| 27 | + \ low[u] = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u])\ |
| 28 | + \ {\n eccs.emplace_back();\n eccs.back().push_back(u);\n in_stack[u]\ |
| 29 | + \ = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\ |
| 30 | + \ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\ |
| 31 | + \ 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" |
| 33 | + 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\nnamespace\ |
| 35 | + \ weilycoder {\ntemplate <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,\ |
| 38 | + \ ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>> eccs;\n\n TwoEdgeConnectedComponents(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) {\n graph[u].emplace_back(v, edge_time);\n \ |
| 41 | + \ graph[v].emplace_back(u, edge_time);\n edge_time++;\n }\n\n void tarjan(ptr_t\ |
| 42 | + \ u, ptr_t parent_edge) {\n dfn[u] = low[u] = ++dfs_time;\n stk.push(u);\n\ |
| 43 | + \ in_stack[u] = true;\n\n for (const auto &[v, edge_id] : graph[u]) {\n\ |
| 44 | + \ if (edge_id == parent_edge)\n continue;\n if (!dfn[v])\n \ |
| 45 | + \ tarjan(v, edge_id), low[u] = std::min(low[u], low[v]);\n else if (in_stack[v])\n\ |
| 46 | + \ low[u] = std::min(low[u], dfn[v]);\n }\n\n if (dfn[u] == low[u])\ |
| 47 | + \ {\n eccs.emplace_back();\n eccs.back().push_back(u);\n in_stack[u]\ |
| 48 | + \ = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\ |
| 49 | + \ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\ |
| 50 | + \ 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" |
| 52 | + dependsOn: [] |
| 53 | + isVerificationFile: false |
| 54 | + path: weilycoder/graph/tarjan.hpp |
| 55 | + requiredBy: [] |
| 56 | + timestamp: '2025-10-28 20:19:29+08:00' |
| 57 | + verificationStatus: LIBRARY_ALL_AC |
| 58 | + verifiedWith: |
| 59 | + - test/two_edge_connected_components.test.cpp |
| 60 | +documentation_of: weilycoder/graph/tarjan.hpp |
| 61 | +layout: document |
| 62 | +redirect_from: |
| 63 | +- /library/weilycoder/graph/tarjan.hpp |
| 64 | +- /library/weilycoder/graph/tarjan.hpp.html |
| 65 | +title: weilycoder/graph/tarjan.hpp |
| 66 | +--- |
0 commit comments