Skip to content

Commit d9855b6

Browse files
committed
network time
1 parent 500ae42 commit d9855b6

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
mod coin_change2;
1+
mod shortestnetworkpath;
22
fn main() {}

src/shortestnetworkpath.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
use std::cmp::min;
2+
3+
pub struct Solution {}
4+
5+
impl Solution {
6+
pub fn network_delay_time(times: Vec<Vec<i32>>, n: i32, k: i32) -> i32 {
7+
use std::cmp::Reverse;
8+
use std::collections::BinaryHeap;
9+
use std::collections::HashMap;
10+
use std::collections::HashSet;
11+
12+
#[derive(PartialEq, Eq, PartialOrd, Ord)]
13+
pub struct Edge {
14+
weight: i32,
15+
node: i32,
16+
}
17+
18+
let mut visited: HashSet<i32> = HashSet::new();
19+
let mut edges: HashMap<i32, Vec<Edge>> = HashMap::new();
20+
21+
for val in times {
22+
let (u, v, w) = (val[0], val[1], val[2]);
23+
24+
let edge = Edge { weight: w, node: v };
25+
26+
if edges.contains_key(&u) {
27+
edges.entry(u).and_modify(|val| val.push(edge));
28+
} else {
29+
edges.insert(u, vec![edge]);
30+
}
31+
}
32+
33+
let mut min_heap: BinaryHeap<Reverse<Edge>> = BinaryHeap::new();
34+
let mut res = 0;
35+
36+
min_heap.push(Reverse(Edge { weight: 0, node: k }));
37+
38+
while !min_heap.is_empty() {
39+
let edge = min_heap.pop().unwrap().0;
40+
41+
if visited.contains(&edge.node) {
42+
continue;
43+
}
44+
visited.insert(edge.node);
45+
res = edge.weight;
46+
47+
if let Some(edges) = edges.get(&edge.node) {
48+
for e in edges {
49+
if !visited.contains(&e.node) {
50+
min_heap.push(Reverse(Edge {
51+
weight: e.weight + res,
52+
node: e.node,
53+
}));
54+
}
55+
}
56+
}
57+
}
58+
59+
if res == 0 || visited.len() != n as usize {
60+
return -1;
61+
}
62+
res
63+
}
64+
}

0 commit comments

Comments
 (0)