-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathevaluate_division.rs
More file actions
75 lines (70 loc) · 2.22 KB
/
evaluate_division.rs
File metadata and controls
75 lines (70 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use std::collections::{btree_map::Values, HashMap, HashSet};
struct Solution;
impl Solution {
pub fn calc_equation(
equations: Vec<Vec<String>>,
values: Vec<f64>,
queries: Vec<Vec<String>>,
) -> Vec<f64> {
let mut adj: HashMap<&str, Vec<(&str, f64)>> = HashMap::new();
for (v, val) in equations.iter().zip(values.iter()) {
adj.entry(v[0].as_str())
.or_default()
.push((v[1].as_str(), *val));
adj.entry(v[1].as_str())
.or_default()
.push((v[0].as_str(), 1.0 / val));
}
fn calculate<'a>(
adj: &HashMap<&str, Vec<(&'a str, f64)>>,
vs: &mut HashSet<&'a str>,
target: &str,
s: &'a str,
) -> (bool, f64) {
if vs.contains(s) {
return (false, 1.0);
}
if s == target {
return (true, 1.0);
}
vs.insert(s);
if adj.contains_key(s) {
for (x, y) in adj.get(s).unwrap().iter() {
let (done, value) = calculate(adj, vs, target, x);
if done {
return (true, value * y);
}
}
}
(false, 1.0)
}
let mut anss = vec![];
for v in queries.iter() {
let (a, b) = (v[0].as_str(), v[1].as_str());
let mut vs = HashSet::new();
let (done, ans) = calculate(&adj, &mut vs, b, a);
println!("{} {}: {:?} {}", a, b, done, ans);
if done && adj.contains_key(a) && adj.contains_key(b) {
anss.push(ans);
} else {
anss.push(-1.0);
}
}
anss
}
}
fn main() {
let equations = vec![vec!["a".into(), "b".into()], vec!["b".into(), "c".into()]];
let values = [2.0, 3.0];
let queries = vec![
vec!["a".into(), "c".into()],
vec!["b".into(), "a".into()],
vec!["a".into(), "e".into()],
vec!["a".into(), "a".into()],
vec!["x".into(), "x".into()],
];
println!(
"{:?}",
Solution::calc_equation(equations, values.into(), queries)
);
}