Skip to content

Commit add1a21

Browse files
authored
nits (#68)
* nits * another rename * fix * update some graph examples * update more graph examples --------- Co-authored-by: Luke Videckis <lukevideckis@gmail.com>
1 parent 41640d0 commit add1a21

File tree

8 files changed

+68
-68
lines changed

8 files changed

+68
-68
lines changed

examples/graphs/cuts_yosupo.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// verification-helper: PROBLEM https://judge.yosupo.jp/problem/biconnected_components
22

33
use proconio::input;
4-
use programming_team_code_rust::graphs::block_vertex_tree::get_bvt;
4+
use programming_team_code_rust::graphs::block_vertex_tree::get_block_vertex_tree;
55
use programming_team_code_rust::graphs::cuts::get_cuts;
66

77
fn main() {
@@ -18,7 +18,7 @@ fn main() {
1818
}
1919

2020
let (num_bccs, is_cut, bcc_id) = get_cuts(&adj, m);
21-
let bvt = get_bvt(&adj, num_bccs, &bcc_id);
21+
let bvt = get_block_vertex_tree(&adj, num_bccs, &bcc_id);
2222

2323
for i in 0..n {
2424
assert_eq!(

src/graphs/block_vertex_tree.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@
66
/// # Example
77
/// ```
88
/// use programming_team_code_rust::graphs::cuts::get_cuts;
9-
/// use programming_team_code_rust::graphs::block_vertex_tree::get_bvt;
9+
/// use programming_team_code_rust::graphs::block_vertex_tree::get_block_vertex_tree;
1010
///
11-
/// let edge_list = [(0,1), (0,1), (1,2), (0,1)];
1211
/// let (n, m) = (3, 4);
1312
/// let mut adj = vec![vec![]; n];
14-
/// for (i, &(u, v)) in edge_list.iter().enumerate() {
13+
/// for (i, &(u, v)) in [(0,1), (0,1), (1,2), (0,1)].iter().enumerate() {
1514
/// adj[u].push((v, i));
1615
/// adj[v].push((u, i));
1716
/// }
1817
///
1918
/// let (num_bccs, _, bcc_id) = get_cuts(&adj, m);
20-
/// let bvt = get_bvt(&adj, num_bccs, &bcc_id);
19+
/// let bvt = get_block_vertex_tree(&adj, num_bccs, &bcc_id);
2120
///
2221
/// assert_eq!(bvt, [vec![4], vec![4, 3], vec![3], vec![1, 2], vec![0, 1]]);
2322
///
@@ -41,7 +40,11 @@
4140
/// # Complexity
4241
/// - Time: O(V + E)
4342
/// - Space: O(V)
44-
pub fn get_bvt(adj: &[Vec<(usize, usize)>], num_bccs: usize, bcc_id: &[usize]) -> Vec<Vec<usize>> {
43+
pub fn get_block_vertex_tree(
44+
adj: &[Vec<(usize, usize)>],
45+
num_bccs: usize,
46+
bcc_id: &[usize],
47+
) -> Vec<Vec<usize>> {
4548
let (n, mut vis) = (adj.len(), vec![false; num_bccs]);
4649
let mut bvt = vec![vec![]; n + num_bccs];
4750
for i in 0..n {

src/graphs/bridges.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
/// ```
88
/// use programming_team_code_rust::graphs::bridges::get_bridges;
99
///
10-
/// let edge_list = [(0,1), (0,1), (1,2), (2,2)];
1110
/// let mut adj = vec![vec![]; 3];
12-
/// for (i, &(u, v)) in edge_list.iter().enumerate() {
11+
/// for (i, &(u, v)) in [(0,1), (0,1), (1,2), (2,2)].iter().enumerate() {
1312
/// adj[u].push((v, i));
1413
/// adj[v].push((u, i));
1514
/// }

src/graphs/count_paths_per_length.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,15 @@ impl CentDecompDfs for CountPathsPerLength {
7272
/// # Example
7373
/// ```
7474
/// use programming_team_code_rust::graphs::count_paths_per_length::count_paths_per_length;
75-
/// let adj = vec![
76-
/// vec![1, 2],
77-
/// vec![0, 3, 4],
78-
/// vec![0, 5, 6],
79-
/// vec![1],
80-
/// vec![1],
81-
/// vec![2],
82-
/// vec![2],
83-
/// ];
75+
///
76+
/// let mut adj = vec![vec![]; 4];
77+
/// for (u, v) in [(0,1), (0,2), (0,3)] {
78+
/// adj[u].push(v);
79+
/// adj[v].push(u);
80+
/// }
81+
///
8482
/// let res = count_paths_per_length(&adj);
85-
/// assert_eq!(res, vec![0, 6, 7, 4, 4, 0, 0]);
83+
/// assert_eq!(res, [0, 3, 3, 0]);
8684
/// ```
8785
///
8886
/// # Complexity

src/graphs/cuts.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
/// ```
88
/// use programming_team_code_rust::graphs::cuts::get_cuts;
99
///
10-
/// let edge_list = [(0,1), (0,1), (1,2), (0,1)];
1110
/// let mut adj = vec![vec![]; 3];
12-
/// for (i, &(u, v)) in edge_list.iter().enumerate() {
11+
/// for (i, &(u, v)) in [(0,1), (0,1), (1,2), (0,1)].iter().enumerate() {
1312
/// adj[u].push((v, i));
1413
/// adj[v].push((u, i));
1514
/// }
@@ -24,9 +23,8 @@
2423
/// # Panics
2524
/// ```panic
2625
/// use programming_team_code_rust::graphs::cuts::get_cuts;
27-
/// let edge_list = [(0,0)];
2826
/// let mut adj = vec![vec![]; 1];
29-
/// for (i, &(u, v)) in edge_list.iter().enumerate() {
27+
/// for (i, &(u, v)) in [(0,0)].iter().enumerate() {
3028
/// adj[u].push((v, i));
3129
/// adj[v].push((u, i));
3230
/// }

src/graphs/hld.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,25 @@ use std::ops::Range;
88
/// use programming_team_code_rust::graphs::hld::HLD;
99
/// use programming_team_code_rust::data_structures::fenwick::Fenwick;
1010
///
11-
/// let mut adj = vec![
12-
/// vec![1, 2],
13-
/// vec![0, 3, 4],
14-
/// vec![0, 5],
15-
/// vec![1],
16-
/// vec![1],
17-
/// vec![2],
18-
/// ];
19-
/// let fenwick = Fenwick::<usize>::build_on_array(&[3, 2, 4, 5, 1, 2]);
11+
/// let n = 4;
12+
/// let mut adj = vec![vec![]; n];
13+
/// for (u, v) in [(0,1), (0,2), (2,3)] {
14+
/// adj[u].push(v);
15+
/// adj[v].push(u);
16+
/// }
2017
///
2118
/// let hld = HLD::new(&mut adj, false);
22-
/// assert_eq!(hld.lca(3, 4), 1);
23-
/// assert_eq!(fenwick.sum(hld.sub_tree(0)), 17);
19+
/// let mut fenwick = Fenwick::<usize>::new(n);
20+
/// let init_vals = [10, 1, 100, 1000];
21+
/// for i in 0..n {
22+
/// fenwick.add(hld.tin[i], init_vals[i]);
23+
/// }
24+
///
25+
/// assert_eq!(hld.lca(1, 3), 0);
26+
/// assert_eq!(fenwick.sum(hld.sub_tree(2)), 1100);
2427
/// let mut sum = 0;
25-
/// hld.path(3, 4, |range, _| sum += fenwick.sum(range));
26-
/// assert_eq!(sum, 11);
28+
/// hld.path(1, 2, |range, _| sum += fenwick.sum(range));
29+
/// assert_eq!(sum, 111);
2730
/// ```
2831
pub struct HLD {
2932
/// parent

src/graphs/lca.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,20 @@ type OpType = fn((usize, usize), (usize, usize)) -> (usize, usize);
99
/// ```
1010
/// use programming_team_code_rust::graphs::lca::LCA;
1111
///
12-
/// let adj = vec![
13-
/// vec![1, 2],
14-
/// vec![0, 3, 4],
15-
/// vec![0, 5],
16-
/// vec![1],
17-
/// vec![1],
18-
/// vec![2],
19-
/// ];
12+
/// let n = 4;
13+
/// let mut adj = vec![vec![]; n];
14+
/// for (u, v) in [(0,1), (0,2), (2,3)] {
15+
/// adj[u].push(v);
16+
/// adj[v].push(u);
17+
/// }
2018
///
2119
/// let lca = LCA::new(&adj);
22-
/// assert_eq!(lca.lca(0, 1), 0);
23-
/// assert_eq!(lca.lca(0, 2), 0);
24-
/// assert_eq!(lca.lca(0, 5), 0);
25-
/// assert_eq!(lca.lca(3, 4), 1);
20+
/// assert_eq!(lca.lca(1, 3), 0);
21+
/// assert_eq!(lca.lca(2, 3), 2);
2622
/// ```
2723
pub struct LCA {
2824
tin: Vec<usize>,
29-
p: Vec<usize>,
25+
p: Vec<Option<usize>>,
3026
rmq: RMQ<(usize, usize), OpType>,
3127
}
3228

@@ -42,21 +38,28 @@ impl LCA {
4238
pub fn new(adj: &[Vec<usize>]) -> Self {
4339
let n = adj.len();
4440
let mut tin = vec![0; n];
45-
let mut p = vec![0; n];
41+
let mut p = vec![None; n];
4642
let mut d = vec![0; n];
4743
let order = get_dfs_preorder(adj);
4844
for (i, &u) in order.iter().enumerate() {
4945
tin[u] = i;
5046
for &v in &adj[u] {
51-
if v != p[u] {
52-
p[v] = u;
53-
d[v] = d[u] + 1;
47+
if Some(v) != p[u] {
48+
(p[v], d[v]) = (Some(u), d[u] + 1);
5449
}
5550
}
5651
}
57-
let d_with_order: Vec<(usize, usize)> = order.iter().map(|&u| (d[u], u)).collect();
58-
let rmq = RMQ::<(usize, usize), OpType>::new(&d_with_order, std::cmp::min);
59-
LCA { tin, p, rmq }
52+
LCA {
53+
tin,
54+
p,
55+
rmq: RMQ::new(
56+
&order
57+
.iter()
58+
.map(|&u| (d[u], u))
59+
.collect::<Vec<(usize, usize)>>(),
60+
std::cmp::min,
61+
),
62+
}
6063
}
6164

6265
/// Gets the lowest common ancestor of u and v
@@ -72,6 +75,6 @@ impl LCA {
7275
if le > ri {
7376
std::mem::swap(&mut le, &mut ri);
7477
}
75-
self.p[self.rmq.query(le + 1..ri + 1).1]
78+
self.p[self.rmq.query(le + 1..ri + 1).1].unwrap()
7679
}
7780
}

src/graphs/scc.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,15 @@ use crate::graphs::dfs_order::get_dfs_postorder;
1111
/// ```
1212
/// use programming_team_code_rust::graphs::scc::get_sccs;
1313
///
14-
/// let adj = vec![
15-
/// vec![1],
16-
/// vec![2],
17-
/// vec![0],
18-
/// vec![3],
19-
/// vec![5],
20-
/// vec![4],
21-
/// vec![5],
22-
/// ];
14+
/// let n = 4;
15+
/// let mut adj = vec![vec![]; n];
16+
/// for (u, v) in [(0,1), (1,2), (2,0), (1,3), (3,3)] {
17+
/// adj[u].push(v);
18+
/// }
2319
///
2420
/// let (num_sccs, scc_id) = get_sccs(&adj);
25-
/// assert_eq!(num_sccs, 4);
26-
/// assert_eq!(scc_id, vec![3, 3, 3, 2, 1, 1, 0]);
21+
/// assert_eq!(num_sccs, 2);
22+
/// assert_eq!(scc_id, [0, 0, 0, 1]);
2723
/// ```
2824
///
2925
/// # Complexity

0 commit comments

Comments
 (0)