2
use std::collections::BinaryHeap;5
pub fn minimum_weight(n: i32, edges: Vec<Vec<i32>>, src1: i32, src2: i32, dest: i32) -> i64 {7
let (mut graph, mut graph_reverse) = (vec![vec![]; n], vec![vec![]; n]);9
let (u, v, w) = (e[0] as usize, e[1] as usize, e[2] as i64);10
graph[u].push((v, w));11
graph_reverse[v].push((u, w));14
let (mut d1, mut d2, mut d3) = (vec![i64::MAX; n], vec![i64::MAX; n], vec![i64::MAX; n]);15
Self::calculate(&graph, &mut d1, src1 as usize);16
Self::calculate(&graph, &mut d2, src2 as usize);17
Self::calculate(&graph_reverse, &mut d3, dest as usize);19
let mut ret = i64::MAX;21
if d1[u] == i64::MAX || d2[u] == i64::MAX || d3[u] == i64::MAX {24
ret = ret.min(d1[u] + d2[u] + d3[u]);34
fn calculate(graph: &Vec<Vec<(usize, i64)>>, dist: &mut Vec<i64>, src: usize) {35
let mut pq = BinaryHeap::new();37
pq.push(Reverse((0i64, src)));39
while let Some(Reverse((d, u))) = pq.pop() {44
for (v, w) in &graph[u] {45
let (v, w) = (*v, *w);51
pq.push(Reverse((d + w, v)));