Skip to content

Commit ec0794d

Browse files
minor lca changes and dfs order changes (#32)
* working on scc * scc too hard
1 parent c2fe241 commit ec0794d

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

examples/graphs/lca_yosupo.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,39 @@ fn main() {
99
q: usize,
1010
}
1111

12-
// undirected tree and a rooted directed tree
13-
let mut undir = vec![vec![]; n + n];
12+
// undirected forest and a rooted directed tree
13+
let mut undir_for = vec![vec![]; n + n];
1414
let mut dir = vec![vec![]; n];
1515
for c in 1..n {
1616
input! {
1717
p: usize,
1818
}
1919

20-
// undirected tree
21-
undir[p].push(c);
22-
undir[c].push(p);
20+
// undirected forest
21+
for &(u, v) in [(p, c), (p + n, c + n)].iter() {
22+
undir_for[u].push(v);
23+
undir_for[v].push(u);
24+
}
2325

2426
// directed tree
2527
dir[p].push(c);
2628
}
2729

28-
let undir_lca = LCA::new(&undir);
30+
let undir_lca = LCA::new(&undir_for);
2931
let dir_lca = LCA::new(&dir);
3032
for _ in 0..q {
3133
input! {
3234
u: usize,
3335
v: usize,
3436
}
3537

36-
let res_undir = undir_lca.lca(u, v);
38+
let res_undir1 = undir_lca.lca(u, v);
39+
let res_undir2 = undir_lca.lca(u + n, v + n) - n;
3740
let res_dir = dir_lca.lca(u, v);
3841

39-
assert_eq!(res_undir, res_dir);
42+
assert_eq!(res_undir1, res_undir2);
43+
assert_eq!(res_undir1, res_dir);
4044

41-
println!("{}", res_undir);
45+
println!("{}", res_dir);
4246
}
4347
}

src/graphs/dfs_order.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
pub fn dfs_order(adj: &[Vec<usize>]) -> Vec<usize> {
22
let n = adj.len();
3-
let mut order = Vec::with_capacity(n);
4-
fn dfs(u: usize, p: usize, adj: &[Vec<usize>], order: &mut Vec<usize>) {
3+
fn dfs(u: usize, adj: &[Vec<usize>], seen: &mut [bool], order: &mut Vec<usize>) {
54
order.push(u);
5+
seen[u] = true;
66
for &v in &adj[u] {
7-
if v != p {
8-
dfs(v, u, adj, order);
7+
if !seen[v] {
8+
dfs(v, adj, seen, order);
99
}
1010
}
1111
}
12-
dfs(0, 0, adj, &mut order);
12+
let mut seen = vec![false; n];
13+
let mut order = Vec::with_capacity(n);
14+
for s in 0..n {
15+
if !seen[s] {
16+
dfs(s, adj, &mut seen, &mut order);
17+
}
18+
}
1319
order
1420
}

src/graphs/lca.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ impl LCA {
3232
/// Create a new LCA struct
3333
///
3434
/// `adj` can be undirected tree or a directed tree (rooted at node 0)
35+
/// `adj` can also be an undirected forest
3536
///
3637
/// # Complexity (n = adj.len())
3738
/// - Time: O(n log n)

0 commit comments

Comments
 (0)