Skip to content

Commit e296420

Browse files
committed
p3108
1 parent 319b5f7 commit e296420

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

src/main.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
mod p3191;
1+
mod p3108;
22

33
pub fn main() {
4-
p3191::run();
4+
p3108::run();
55
}

src/p3108.rs

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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

Comments
 (0)