cp_library_rs/graph/
bellman_ford.rs1use crate::utils::consts::Infinity;
4
5pub fn bellman_ford(
25 N: usize,
26 start: usize,
27 edges: &Vec<(usize, usize, i64)>,
28) -> (bool, Vec<i64>, Vec<usize>) {
29 let mut dist = vec![2 * i64::infinity(); N];
30 dist[start] = 0;
31 let mut prev = vec![usize::infinity(); N];
32
33 for _ in 0..N {
34 for &(u, v, w) in edges {
35 if dist[v] > dist[u] + w {
37 dist[v] = dist[u] + w;
38 prev[v] = u;
39 }
40 }
41 }
42
43 let mut has_negative = false;
45
46 for &(u, v, w) in edges {
47 if dist[v] > dist[u] + w {
48 has_negative = true;
49 if dist[u] < i64::infinity() {
51 dist[v] = -i64::infinity();
52 }
53 }
54 }
55
56 dist.iter_mut().for_each(|d| {
58 if *d > i64::infinity() {
59 *d = i64::infinity();
60 }
61 });
62
63 for _ in 0..N {
65 for &(u, v, w) in edges {
66 if dist[u] == i64::infinity() || dist[v] == i64::infinity() {
67 continue;
68 }
69 if dist[v] > dist[u] + w {
71 dist[v] = -i64::infinity();
72 }
73 }
74 }
75
76 (has_negative, dist, prev)
77}