@@ -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/// ```
2723pub 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}
0 commit comments