Skip to content

Commit 3187eb0

Browse files
authored
[auto-verifier] docs commit fe11f63
1 parent 8ad478a commit 3187eb0

File tree

5 files changed

+166
-21
lines changed

5 files changed

+166
-21
lines changed

index.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
---
22
data:
33
libraryCategories:
4+
- name: weilycoder/graph
5+
pages:
6+
- icon: ':heavy_check_mark:'
7+
path: weilycoder/graph/tarjan.hpp
8+
title: weilycoder/graph/tarjan.hpp
49
- name: weilycoder
510
pages:
611
- icon: ':heavy_check_mark:'
@@ -9,6 +14,9 @@ data:
914
verificationCategories:
1015
- name: test
1116
pages:
17+
- icon: ':heavy_check_mark:'
18+
path: test/two_edge_connected_components.test.cpp
19+
title: test/two_edge_connected_components.test.cpp
1220
- icon: ':heavy_check_mark:'
1321
path: test/unionfind.test.cpp
1422
title: test/unionfind.test.cpp
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
data:
3+
_extendedDependsOn:
4+
- icon: ':heavy_check_mark:'
5+
path: weilycoder/graph/tarjan.hpp
6+
title: weilycoder/graph/tarjan.hpp
7+
_extendedRequiredBy: []
8+
_extendedVerifiedWith: []
9+
_isVerificationFailed: false
10+
_pathExtension: cpp
11+
_verificationStatusIcon: ':heavy_check_mark:'
12+
attributes:
13+
'*NOT_SPECIAL_COMMENTS*': ''
14+
PROBLEM: https://judge.yosupo.jp/problem/two_edge_connected_components
15+
links:
16+
- https://judge.yosupo.jp/problem/two_edge_connected_components
17+
bundledCode: "#line 1 \"test/two_edge_connected_components.test.cpp\"\n#define PROBLEM\
18+
\ \"https://judge.yosupo.jp/problem/two_edge_connected_components\"\n\n#line 1\
19+
\ \"weilycoder/graph/tarjan.hpp\"\n\n\n\n#include <cstddef>\n#include <stack>\n\
20+
#include <utility>\n#include <vector>\n\nnamespace weilycoder {\ntemplate <typename\
21+
\ ptr_t = size_t> struct TwoEdgeConnectedComponents {\n ptr_t dfs_time = 0, edge_time\
22+
\ = 1;\n\n std::vector<bool> in_stack;\n std::stack<ptr_t> stk;\n std::vector<ptr_t>\
23+
\ dfn, low;\n std::vector<std::vector<std::pair<ptr_t, ptr_t>>> graph;\n\n std::vector<std::vector<ptr_t>>\
24+
\ eccs;\n\n TwoEdgeConnectedComponents(ptr_t n)\n : in_stack(n, false),\
25+
\ dfn(n, 0), low(n, 0), graph(n) {}\n\n void add_edge(ptr_t u, ptr_t v) {\n \
26+
\ graph[u].emplace_back(v, edge_time);\n graph[v].emplace_back(u, edge_time);\n\
27+
\ edge_time++;\n }\n\n void tarjan(ptr_t u, ptr_t parent_edge) {\n dfn[u]\
28+
\ = low[u] = ++dfs_time;\n stk.push(u);\n in_stack[u] = true;\n\n for\
29+
\ (const auto &[v, edge_id] : graph[u]) {\n if (edge_id == parent_edge)\n\
30+
\ continue;\n if (!dfn[v])\n tarjan(v, edge_id), low[u] = std::min(low[u],\
31+
\ low[v]);\n else if (in_stack[v])\n low[u] = std::min(low[u], dfn[v]);\n\
32+
\ }\n\n if (dfn[u] == low[u]) {\n eccs.emplace_back();\n eccs.back().push_back(u);\n\
33+
\ in_stack[u] = false;\n while (stk.top() != u)\n eccs.back().push_back(stk.top()),\
34+
\ in_stack[stk.top()] = false, stk.pop();\n stk.pop();\n }\n }\n\n void\
35+
\ solve() {\n for (size_t i = 0; i < graph.size(); ++i)\n if (!dfn[i])\n\
36+
\ tarjan(i, 0);\n }\n};\n} // namespace weilycoder\n\n\n#line 4 \"test/two_edge_connected_components.test.cpp\"\
37+
\n#include <iostream>\nusing namespace std;\nusing namespace weilycoder;\n\nint\
38+
\ main() {\n cin.tie(nullptr)->sync_with_stdio(false);\n cin.exceptions(cin.failbit\
39+
\ | cin.badbit);\n size_t n, m;\n cin >> n >> m;\n\n TwoEdgeConnectedComponents\
40+
\ graph(n);\n for (size_t i = 0; i < m; ++i) {\n size_t u, v;\n cin >>\
41+
\ u >> v;\n graph.add_edge(u, v);\n }\n\n graph.solve();\n\n cout << graph.eccs.size()\
42+
\ << '\\n';\n for (const auto &ecc : graph.eccs) {\n cout << ecc.size();\n\
43+
\ for (size_t u : ecc)\n cout << ' ' << u;\n cout << '\\n';\n }\n\
44+
\ return 0;\n}\n"
45+
code: "#define PROBLEM \"https://judge.yosupo.jp/problem/two_edge_connected_components\"\
46+
\n\n#include \"../weilycoder/graph/tarjan.hpp\"\n#include <iostream>\nusing namespace\
47+
\ std;\nusing namespace weilycoder;\n\nint main() {\n cin.tie(nullptr)->sync_with_stdio(false);\n\
48+
\ cin.exceptions(cin.failbit | cin.badbit);\n size_t n, m;\n cin >> n >> m;\n\
49+
\n TwoEdgeConnectedComponents graph(n);\n for (size_t i = 0; i < m; ++i) {\n\
50+
\ size_t u, v;\n cin >> u >> v;\n graph.add_edge(u, v);\n }\n\n graph.solve();\n\
51+
\n cout << graph.eccs.size() << '\\n';\n for (const auto &ecc : graph.eccs)\
52+
\ {\n cout << ecc.size();\n for (size_t u : ecc)\n cout << ' ' << u;\n\
53+
\ cout << '\\n';\n }\n return 0;\n}\n"
54+
dependsOn:
55+
- weilycoder/graph/tarjan.hpp
56+
isVerificationFile: true
57+
path: test/two_edge_connected_components.test.cpp
58+
requiredBy: []
59+
timestamp: '2025-10-28 20:19:29+08:00'
60+
verificationStatus: TEST_ACCEPTED
61+
verifiedWith: []
62+
documentation_of: test/two_edge_connected_components.test.cpp
63+
layout: document
64+
redirect_from:
65+
- /verify/test/two_edge_connected_components.test.cpp
66+
- /verify/test/two_edge_connected_components.test.cpp.html
67+
title: test/two_edge_connected_components.test.cpp
68+
---

test/unionfind.test.cpp.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ data:
1515
links:
1616
- https://judge.yosupo.jp/problem/unionfind
1717
bundledCode: "#line 1 \"test/unionfind.test.cpp\"\n#define PROBLEM \"https://judge.yosupo.jp/problem/unionfind\"\
18-
\n\n#line 1 \"weilycoder/unionfind.hpp\"\n#include <algorithm>\n#include <numeric>\n\
19-
#include <vector>\n\nnamespace weilycoder {\ntemplate <typename ptr_t = size_t>\
20-
\ struct UnionFind {\n std::vector<ptr_t> parent, size;\n\n UnionFind(ptr_t\
18+
\n\n#line 1 \"weilycoder/unionfind.hpp\"\n\n\n\n#include <algorithm>\n#include\
19+
\ <numeric>\n#include <vector>\n\nnamespace weilycoder {\ntemplate <typename ptr_t\
20+
\ = size_t> struct UnionFind {\n std::vector<ptr_t> parent, size;\n\n UnionFind(ptr_t\
2121
\ n) : parent(n), size(n, 1) {\n std::iota(parent.begin(), parent.end(), 0);\n\
2222
\ }\n\n ptr_t getf(ptr_t x) {\n while (x != parent[x])\n x = parent[x]\
2323
\ = parent[parent[x]];\n return x;\n }\n\n bool unite(ptr_t x, ptr_t y) {\n\
2424
\ x = getf(x), y = getf(y);\n if (x == y)\n return false;\n if (size[x]\
2525
\ < size[y])\n std::swap(x, y);\n parent[y] = x, size[x] += size[y];\n\
26-
\ return true;\n }\n};\n} // namespace weilycoder\n#line 4 \"test/unionfind.test.cpp\"\
26+
\ return true;\n }\n};\n} // namespace weilycoder\n\n\n#line 4 \"test/unionfind.test.cpp\"\
2727
\n#include <iostream>\nusing namespace std;\nusing namespace weilycoder;\n\nint\
2828
\ main() {\n cin.tie(nullptr)->sync_with_stdio(false);\n cin.exceptions(cin.failbit\
2929
\ | cin.badbit);\n size_t n, q;\n cin >> n >> q;\n UnionFind uf(n);\n for\
@@ -32,8 +32,8 @@ data:
3232
\ 1:\n cout << (uf.getf(x) == uf.getf(y) ? \"1\\n\" : \"0\\n\");\n break;\n\
3333
\ }\n }\n return 0;\n}\n"
3434
code: "#define PROBLEM \"https://judge.yosupo.jp/problem/unionfind\"\n\n#include\
35-
\ \"weilycoder/unionfind.hpp\"\n#include <iostream>\nusing namespace std;\nusing\
36-
\ namespace weilycoder;\n\nint main() {\n cin.tie(nullptr)->sync_with_stdio(false);\n\
35+
\ \"../weilycoder/unionfind.hpp\"\n#include <iostream>\nusing namespace std;\n\
36+
using namespace weilycoder;\n\nint main() {\n cin.tie(nullptr)->sync_with_stdio(false);\n\
3737
\ cin.exceptions(cin.failbit | cin.badbit);\n size_t n, q;\n cin >> n >> q;\n\
3838
\ UnionFind uf(n);\n for (size_t _ = 0; _ < q; ++_) {\n size_t op, x, y;\n\
3939
\ cin >> op >> x >> y;\n switch (op) {\n case 0:\n uf.unite(x, y);\n\
@@ -44,7 +44,7 @@ data:
4444
isVerificationFile: true
4545
path: test/unionfind.test.cpp
4646
requiredBy: []
47-
timestamp: '2025-10-28 18:41:48+08:00'
47+
timestamp: '2025-10-28 20:19:29+08:00'
4848
verificationStatus: TEST_ACCEPTED
4949
verifiedWith: []
5050
documentation_of: test/unionfind.test.cpp

weilycoder/graph/tarjan.hpp.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
---

weilycoder/unionfind.hpp.md

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,31 @@ data:
1111
_verificationStatusIcon: ':heavy_check_mark:'
1212
attributes:
1313
links: []
14-
bundledCode: "#line 1 \"weilycoder/unionfind.hpp\"\n#include <algorithm>\n#include\
15-
\ <numeric>\n#include <vector>\n\nnamespace weilycoder {\ntemplate <typename ptr_t\
16-
\ = size_t> struct UnionFind {\n std::vector<ptr_t> parent, size;\n\n UnionFind(ptr_t\
17-
\ n) : parent(n), size(n, 1) {\n std::iota(parent.begin(), parent.end(), 0);\n\
18-
\ }\n\n ptr_t getf(ptr_t x) {\n while (x != parent[x])\n x = parent[x]\
19-
\ = parent[parent[x]];\n return x;\n }\n\n bool unite(ptr_t x, ptr_t y) {\n\
20-
\ x = getf(x), y = getf(y);\n if (x == y)\n return false;\n if (size[x]\
21-
\ < size[y])\n std::swap(x, y);\n parent[y] = x, size[x] += size[y];\n\
22-
\ return true;\n }\n};\n} // namespace weilycoder\n"
23-
code: "#include <algorithm>\n#include <numeric>\n#include <vector>\n\nnamespace\
24-
\ weilycoder {\ntemplate <typename ptr_t = size_t> struct UnionFind {\n std::vector<ptr_t>\
25-
\ parent, size;\n\n UnionFind(ptr_t n) : parent(n), size(n, 1) {\n std::iota(parent.begin(),\
14+
bundledCode: "#line 1 \"weilycoder/unionfind.hpp\"\n\n\n\n#include <algorithm>\n\
15+
#include <numeric>\n#include <vector>\n\nnamespace weilycoder {\ntemplate <typename\
16+
\ ptr_t = size_t> struct UnionFind {\n std::vector<ptr_t> parent, size;\n\n \
17+
\ UnionFind(ptr_t n) : parent(n), size(n, 1) {\n std::iota(parent.begin(),\
2618
\ parent.end(), 0);\n }\n\n ptr_t getf(ptr_t x) {\n while (x != parent[x])\n\
2719
\ x = parent[x] = parent[parent[x]];\n return x;\n }\n\n bool unite(ptr_t\
2820
\ x, ptr_t y) {\n x = getf(x), y = getf(y);\n if (x == y)\n return\
2921
\ false;\n if (size[x] < size[y])\n std::swap(x, y);\n parent[y] =\
30-
\ x, size[x] += size[y];\n return true;\n }\n};\n} // namespace weilycoder\n"
22+
\ x, size[x] += size[y];\n return true;\n }\n};\n} // namespace weilycoder\n\
23+
\n\n"
24+
code: "#ifndef WEILYCODER_UNIONFIND_HPP\n#define WEILYCODER_UNIONFIND_HPP\n\n#include\
25+
\ <algorithm>\n#include <numeric>\n#include <vector>\n\nnamespace weilycoder {\n\
26+
template <typename ptr_t = size_t> struct UnionFind {\n std::vector<ptr_t> parent,\
27+
\ size;\n\n UnionFind(ptr_t n) : parent(n), size(n, 1) {\n std::iota(parent.begin(),\
28+
\ parent.end(), 0);\n }\n\n ptr_t getf(ptr_t x) {\n while (x != parent[x])\n\
29+
\ x = parent[x] = parent[parent[x]];\n return x;\n }\n\n bool unite(ptr_t\
30+
\ x, ptr_t y) {\n x = getf(x), y = getf(y);\n if (x == y)\n return\
31+
\ false;\n if (size[x] < size[y])\n std::swap(x, y);\n parent[y] =\
32+
\ x, size[x] += size[y];\n return true;\n }\n};\n} // namespace weilycoder\n\
33+
\n#endif\n"
3134
dependsOn: []
3235
isVerificationFile: false
3336
path: weilycoder/unionfind.hpp
3437
requiredBy: []
35-
timestamp: '2025-10-28 18:41:48+08:00'
38+
timestamp: '2025-10-28 20:19:29+08:00'
3639
verificationStatus: LIBRARY_ALL_AC
3740
verifiedWith:
3841
- test/unionfind.test.cpp

0 commit comments

Comments
 (0)