Skip to content

Commit 46dabce

Browse files
committed
add templatized versions of graphs
1 parent c2a18e3 commit 46dabce

File tree

14 files changed

+60
-23
lines changed

14 files changed

+60
-23
lines changed

library/graphs/bridges_cuts/block_vertex_tree.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
//! vector<vector<pii>> adj(n);
55
//! cuts cc(adj, m);
66
//! vector<vi> bvt = block_vertex_tree(adj, cc);
7+
//! vector<basic_string<array<int, 2>>> adj1(n);
8+
//! cuts cc1(adj1, m);
9+
//! vector<vi> bvt1 = block_vertex_tree(adj1, cc1);
710
//! //to loop over each unique bcc containing a node u:
811
//! for (int bccid : bvt[v]) {
912
//! bccid -= n;
@@ -15,8 +18,9 @@
1518
//! [n, n + num_bccs) are BCC nodes
1619
//! @time O(n + m)
1720
//! @time O(n)
18-
vector<vi> block_vertex_tree(
19-
const vector<vector<pii>>& adj, const cuts& cc) {
21+
template<class G>
22+
vector<vi> block_vertex_tree(const G& adj,
23+
const cuts& cc) {
2024
int n = sz(adj);
2125
vector<vi> bvt(n + cc.num_bccs);
2226
vector<bool> vis(cc.num_bccs);

library/graphs/bridges_cuts/bridge_tree.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
//! vector<vector<pii>> adj(n);
55
//! bridges br(adj, m);
66
//! vector<vi> bt = bridge_tree(adj, br);
7+
//! vector<basic_string<array<int, 2>>> adj1(n);
8+
//! bridges br1(adj1, m);
9+
//! vector<vi> bt1 = bridge_tree(adj1, br1);
710
//! @endcode
811
//! @time O(n + m)
912
//! @space O(n)

library/graphs/bridges_cuts/bridges.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,19 @@
1010
//! adj[v].emplace_back(u, i);
1111
//! }
1212
//! auto [num_ccs, is_bridge, br_id] = bridges(adj, m);
13+
//! vector<basic_string<array<int,2>>> adj1(n);
14+
//! auto [num_ccs1, is_bridge1, br_id1] = bridges(adj1,
15+
//! m);
1316
//! @endcode
1417
//! is_bridge[edge id] = 1 iff bridge edge
1518
//! br_id[v] = id, 0<=id<num_ccs
1619
//! @time O(n + m)
1720
//! @space O(n + m)
18-
struct bridges {
21+
template<class G> struct bridges {
1922
int num_ccs = 0;
2023
vector<bool> is_bridge;
2124
vi br_id;
22-
bridges(const vector<vector<pii>>& adj, int m):
25+
bridges(const G& adj, int m):
2326
is_bridge(m), br_id(sz(adj), -1) {
2427
int n = sz(adj), timer = 1;
2528
vi tin(n), st;

library/graphs/bridges_cuts/cuts.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,18 @@
1111
//! adj[v].emplace_back(u, i);
1212
//! }
1313
//! auto [num_bccs, is_cut, bcc_id] = cuts(adj, m);
14+
//! vector<basic_string<array<int,2>>> adj1(n);
15+
//! auto [num_bccs1, is_cut1, bcc_id1] = cuts(adj1, m);
1416
//! @endcode
1517
//! is_cut[v] = 1 iff cut node
1618
//! bcc_id[edge id] = id, 0<=id<num_bccs
1719
//! @time O(n + m)
1820
//! @space O(n + m)
19-
struct cuts {
21+
template<class G> struct cuts {
2022
int num_bccs = 0;
2123
vector<bool> is_cut;
2224
vi bcc_id;
23-
cuts(const vector<vector<pii>>& adj, int m):
25+
cuts(const G& adj, int m):
2426
is_cut(sz(adj)), bcc_id(m, -1) {
2527
int n = sz(adj), timer = 1;
2628
vi tin(n), st;

library/graphs/complement_graph_ccs.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
#pragma once
22
//! @code
33
//! vector<vi> adj(n);
4-
//! auto cc_id = get_complement_graph_ccs(adj);
4+
//! vi cc_id = get_complement_graph_ccs(adj);
5+
//! vector<basic_string<int>> adj1;
6+
//! vi cc_id2 = get_complement_graph_ccs(adj1);
57
//! @endcode
68
//! 0<=cc_id[v]<number of connected components
79
//! in the complement graph
810
//! cc_id[u] == cc_id[v] if u,v are in the same
911
//! cc in the compliment graph
1012
//! @time O(n + m)
1113
//! @space O(n)
12-
vi get_complement_graph_ccs(const vector<vi> &adj) {
14+
template<class G>
15+
vi get_complement_graph_ccs(const G& adj) {
1316
int n = sz(adj);
1417
vi cc_id(n), unseen(n);
1518
iota(all(unseen), 0);

library/graphs/dijkstra.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
//! @code
33
//! vector<vector<pair<int, ll>>> adj(n);
44
//! auto d = dijkstra(adj, source);
5+
//! vector<basic_string<array<int, 2>>> adj1(n);
6+
//! auto d1 = dijkstra(adj1, source);
57
//! @endcode
68
//! d[v] = min dist from source->..->v
79
//! @time O(n + (m log m))

library/graphs/hopcroft_karp.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
//! adj[l].push_back(r); // add edge l <-> r
66
//! auto [matching_size, to_r, to_l,
77
//! mvc_l, mvc_r] = hopcroft_karp(adj, rsz);
8+
//! vector<basic_string<int>> adj1(lsz);
9+
//! hopcroft_karp match(adj1);
810
//! @endcode
911
//! 0<=l<lsz; 0<=r<rsz
1012
//! l <-> to_r[l] in matching if to_r[l]!=-1

library/graphs/strongly_connected_components/scc.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
//! @code
44
//! vector<vi> adj(n);
55
//! auto [num_sccs, scc_id] = sccs(adj);
6+
//! vector<basic_string<int>> adj1(n);
7+
//! auto [num_sccs1, scc_id1] = sccs(adj1);
68
//! @endcode
79
//! scc_id[v] = id, 0<=id<num_sccs
810
//! for each edge u -> v: scc_id[u] >= scc_id[v]

library/trees/centroid_decomp.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
//! centroid(adj, [&](const vector<vi>& adj,
55
//! int cent, int par_cent) {
66
//! });
7+
//! vector<basic_string<int>> adj1(n);
8+
//! centroid(adj1,
9+
//! [&](const vector<basic_string<int>>& adj1,
10+
//! int cent, int par_cent) {});
711
//! @endcode
812
//! @time O(n log n)
913
//! @space O(n)
10-
template<class F> struct centroid {
11-
vector<vi> adj;
14+
template<class F, class G> struct centroid {
15+
G adj;
1216
F f;
1317
vi siz;
14-
centroid(const vector<vi>& adj, F f):
18+
centroid(const G& adj, F f):
1519
adj(adj), f(f), siz(sz(adj), -1) {
1620
rep(i, 0, sz(adj)) if (siz[i] == -1) dfs(i, -1);
1721
}

library/trees/edge_cd.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,19 @@
1111
//! // subtrees of suffix [split, sz(adj[cent]))
1212
//! // of adj[cent] are the second edge-set
1313
//! });
14+
//! vector<basic_string<int>> adj1(n);
15+
//! edge_cd(adj1, [&](
16+
//! const vector<basic_string<int>>& adj1,
17+
//! int cent, int split) {});
1418
//! @endcode
1519
//! handle single-edge-paths separately
1620
//! @time O(n log1.5 n)
1721
//! @space O(n)
18-
template<class F> struct edge_cd {
19-
vector<vi> adj;
22+
template<class F, class G> struct edge_cd {
23+
G adj;
2024
F f;
2125
vi sub_sz;
22-
edge_cd(const vector<vi>& adj, F f):
26+
edge_cd(const G& adj, F f):
2327
adj(adj), f(f), sub_sz(sz(adj)) {
2428
dfs(0, sz(adj));
2529
}

0 commit comments

Comments
 (0)