Skip to content

Commit 53e655c

Browse files
committed
Runtime: 10 ms (Top 100.0%) | Memory: 3.70 MB (Top 100.0%)
1 parent cd54ca6 commit 53e655c

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Runtime: 10 ms (Top 100.0%) | Memory: 3.70 MB (Top 100.0%)
2+
3+
use std::collections::*;
4+
5+
const MOD:usize = 1_000_000_007;
6+
const INF:usize = 1_000_000_000_000_000;
7+
fn dfs(memo:&Vec<(usize,HashSet<usize>)>, dp:&mut Vec<usize>, i:usize) -> usize {
8+
if dp[i] == INF {
9+
let mut temp = 0;
10+
for &j in &memo[i].1 {
11+
temp += dfs(memo, dp, j);
12+
temp %= MOD;
13+
}
14+
dp[i] = temp;
15+
}
16+
17+
dp[i]
18+
}
19+
20+
impl Solution {
21+
pub fn count_paths(n: i32, roads: Vec<Vec<i32>>) -> i32 {
22+
let n = n as usize;
23+
let mut g = vec![vec![];n];
24+
for arr in roads {
25+
let a = arr[0] as usize;
26+
let b = arr[1] as usize;
27+
let c = arr[2] as usize;
28+
g[a].push((b,c));
29+
g[b].push((a,c));
30+
}
31+
32+
33+
let mut memo = vec![(INF,HashSet::new());n];
34+
memo[0].0 = 0;
35+
let mut stack = vec![(0,0)];
36+
while !stack.is_empty() {
37+
let mut new_stack = vec![];
38+
while let Some((ci,cv)) = stack.pop() {
39+
for &(ni, v) in &g[ci] {
40+
let nv = cv + v;
41+
if nv < memo[ni].0 {
42+
memo[ni].1 = HashSet::new();
43+
memo[ni].1.insert(ci);
44+
memo[ni].0 = nv;
45+
new_stack.push((ni,nv));
46+
} else if nv == memo[ni].0 {
47+
memo[ni].1.insert(ci);
48+
}
49+
}
50+
}
51+
stack = new_stack;
52+
}
53+
54+
let mut result = vec![INF;n];
55+
result[0] = 1;
56+
57+
dfs(&memo, &mut result, n-1) as i32
58+
}
59+
}

0 commit comments

Comments
 (0)