1
+ use std:: collections:: HashMap ;
2
+
3
+ pub fn run ( ) {
4
+ for i in [
5
+ // (5, vec![vec![0,1,7],vec![1,3,7],vec![1,2,1]], vec![vec![0,3],vec![3,4]]),
6
+ // (3, vec![vec![0,2,7],vec![0,1,15],vec![1,2,6],vec![1,2,1]], vec![vec![1,2]]),
7
+ ( 6 , vec ! [ vec![ 1 , 5 , 1 ] , vec![ 4 , 3 , 3 ] , vec![ 3 , 5 , 3 ] , vec![ 1 , 0 , 1 ] , vec![ 3 , 0 , 0 ] ] , vec ! [ vec![ 0 , 2 ] , vec![ 4 , 5 ] , vec![ 5 , 1 ] , vec![ 0 , 4 ] , vec![ 0 , 1 ] , vec![ 0 , 4 ] , vec![ 4 , 2 ] , vec![ 4 , 0 ] ] )
8
+ // [-1,0,0,0,0,0,-1,0]
9
+ ] {
10
+ println ! ( "{:?}" , minimum_cost( i. 0 , i. 1 , i. 2 ) ) ;
11
+ }
12
+ }
13
+
14
+ pub fn minimum_cost ( n : i32 , edges : Vec < Vec < i32 > > , query : Vec < Vec < i32 > > ) -> Vec < i32 > {
15
+ let mut representatives: Vec < usize > = ( 0 ..( n as usize ) ) . collect ( ) ;
16
+ let mut weightage: HashMap < usize , i32 > = HashMap :: new ( ) ;
17
+
18
+ // to implement rank-optimised uf
19
+ let mut level: Vec < usize > = vec ! [ 1 ; n as usize ] ;
20
+
21
+ pub fn get_representative ( i : usize , r : & mut Vec < usize > ) -> usize {
22
+ let p = r[ i as usize ] ;
23
+ if i == p {
24
+ return i;
25
+ }
26
+ r[ i] = get_representative ( p, r) ;
27
+ r[ i]
28
+ }
29
+
30
+ pub fn union ( a : usize , b : usize , r : & mut Vec < usize > , level : & mut Vec < usize > ) {
31
+ let r_a = get_representative ( a, r) ;
32
+ let r_b = get_representative ( b, r) ;
33
+
34
+ if r_a == r_b {
35
+ // both have same representatives, both are in the same group
36
+ return ;
37
+ }
38
+
39
+ if level[ r_a] < level[ r_b] {
40
+ r[ r_a] = r_b;
41
+ level[ r_b] += level[ r_a] ;
42
+ } else {
43
+ r[ r_b] = r_a;
44
+ level[ r_a] += level[ r_b] ;
45
+ }
46
+ }
47
+
48
+ for i in & edges {
49
+ union ( i[ 0 ] as usize , i[ 1 ] as usize , & mut representatives, & mut level) ;
50
+ }
51
+
52
+ for i in & edges {
53
+ let p = get_representative ( i[ 0 ] as usize , & mut representatives) ;
54
+ match weightage. get_mut ( & p) {
55
+ Some ( w) => {
56
+ * w &= i[ 2 ] ;
57
+ } ,
58
+ None => {
59
+ weightage. insert ( p, i[ 2 ] ) ;
60
+ }
61
+ }
62
+ }
63
+
64
+ let mut result = vec ! [ ] ;
65
+
66
+ for i in query {
67
+ let r_a = get_representative ( i[ 0 ] as usize , & mut representatives) ;
68
+ let r_b = get_representative ( i[ 1 ] as usize , & mut representatives) ;
69
+
70
+ if r_a != r_b {
71
+ result. push ( -1 ) ;
72
+ } else {
73
+ result. push ( * weightage. get ( & r_a) . unwrap ( ) ) ;
74
+ }
75
+ }
76
+
77
+ result
78
+ }
0 commit comments