fn main() { inputv! { t:usize, n:usize,m:usize, } let mut graph = vec![vec![]; n * 2]; for i in 0..m { inputv! { u:usize,v:usize,w:isize } graph[2 * (u - 1) + 1].push((2 * (v - 1), w)); if t == 0 { graph[2 * (v - 1)].push((2 * (u - 1) + 1, w)); } } for i in 0..n { graph[2 * i].push((2 * i + 1, 0)); } let mut ans = isize::max_value(); for i in 0..n { let r = dijkstra(&graph, 2 * i + 1); ans = std::cmp::min(ans, r[2 * i]); } println!("{}", if ans == isize::max_value() { -1 } else { ans }); } //https://github.com/manta1130/competitive-template-rs use graph::*; use input::*; pub mod graph { use std::cmp; use std::collections::BinaryHeap; #[allow(clippy::ptr_arg)] pub fn bellman_ford(graph: &Vec>, dist: &mut [Option]) -> Vec { let mut neg_flag = vec![false; dist.len()]; for _ in 0..graph.len() { for (from, v) in graph.iter().enumerate() { for e in v.iter() { let cost = e.1; let to = e.0; if let Some(x) = dist[from] { if dist[to].is_none() { dist[to] = Some(x + cost); } else if let Some(y) = dist[to] { if y > x + cost { dist[to] = Some(x + cost); } } } } } } for _ in 0..graph.len() { for (from, v) in graph.iter().enumerate() { for e in v.iter() { let cost = e.1; let to = e.0; if let Some(x) = dist[from] { if dist[to].is_none() { dist[to] = Some(x + cost); neg_flag[to] = true; } else if let Some(y) = dist[to] { if y > x + cost { dist[to] = Some(x + cost); neg_flag[to] = true; } } } if neg_flag[from] { neg_flag[to] = true; } } } } neg_flag } #[allow(clippy::ptr_arg)] pub fn dijkstra(graph: &Vec>, start: usize) -> Vec { let mut heap = BinaryHeap::new(); let mut dist = vec![isize::max_value(); graph.len()]; dist[start] = 0; heap.push((0_isize, start)); while !heap.is_empty() { let e = heap.pop().unwrap(); if e.0.wrapping_neg() > dist[e.1] { continue; } for next_e in graph[e.1].iter() { if dist[next_e.0] > next_e.1 + dist[e.1] { dist[next_e.0] = next_e.1 + dist[e.1]; heap.push(((dist[e.1] + next_e.1).wrapping_neg(), next_e.0)); } } } dist } pub fn warshall_floyd(graph: &mut [&mut [isize]]) { for k in 0..graph.len() { for i in 0..graph.len() { for j in 0..graph.len() { graph[i][j] = cmp::min(graph[i][j], graph[i][k] + graph[k][j]); } } } } } pub mod input { use std::cell::RefCell; use std::io; pub const SPLIT_DELIMITER: char = ' '; pub use std::io::prelude::*; #[macro_export] thread_local! { pub static INPUT_BUFFER:RefCell>=RefCell::new(std::collections::VecDeque::new()); } #[macro_export] macro_rules! input_internal { ($x:ident : $t:ty) => { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let temp_str = input_line_str(); let mut split_result_iter = temp_str .split(SPLIT_DELIMITER) .map(|q| q.to_string()) .collect::>(); p.borrow_mut().append(&mut split_result_iter) } }); let mut buf_split_result = String::new(); INPUT_BUFFER.with(|p| buf_split_result = p.borrow_mut().pop_front().unwrap()); let $x: $t = buf_split_result.parse().unwrap(); }; (mut $x:ident : $t:ty) => { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let temp_str = input_line_str(); let mut split_result_iter = temp_str .split(SPLIT_DELIMITER) .map(|q| q.to_string()) .collect::>(); p.borrow_mut().append(&mut split_result_iter) } }); let mut buf_split_result = String::new(); INPUT_BUFFER.with(|p| buf_split_result = p.borrow_mut().pop_front().unwrap()); let mut $x: $t = buf_split_result.parse().unwrap(); }; } #[macro_export] macro_rules! inputv { ($i:ident : $t:ty) => { input_internal!{$i : $t} }; (mut $i:ident : $t:ty) => { input_internal!{mut $i : $t} }; ($i:ident : $t:ty $(,)*) => { input_internal!{$i : $t} }; (mut $i:ident : $t:ty $(,)*) => { input_internal!{mut $i : $t} }; (mut $i:ident : $t:ty,$($q:tt)*) => { input_internal!{mut $i : $t} inputv!{$($q)*} }; ($i:ident : $t:ty,$($q:tt)*) => { input_internal!{$i : $t} inputv!{$($q)*} }; } pub fn input_all() { INPUT_BUFFER.with(|p| { if p.borrow().len() == 0 { let mut temp_str = String::new(); std::io::stdin().read_to_string(&mut temp_str).unwrap(); let mut split_result_iter = temp_str .split_whitespace() .map(|q| q.to_string()) .collect::>(); p.borrow_mut().append(&mut split_result_iter) } }); } pub fn input_line_str() -> String { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); s.trim().to_string() } #[allow(clippy::match_wild_err_arm)] pub fn input_vector() -> Vec where T: std::str::FromStr, { let mut v: Vec = Vec::new(); let s = input_line_str(); let split_result = s.split(SPLIT_DELIMITER); for z in split_result { let buf = match z.parse() { Ok(r) => r, Err(_) => panic!("Parse Error",), }; v.push(buf); } v } #[allow(clippy::match_wild_err_arm)] pub fn input_vector_row(n: usize) -> Vec where T: std::str::FromStr, { let mut v = Vec::with_capacity(n); for _ in 0..n { let buf = match input_line_str().parse() { Ok(r) => r, Err(_) => panic!("Parse Error",), }; v.push(buf); } v } pub trait ToCharVec { fn to_charvec(&self) -> Vec; } impl ToCharVec for String { fn to_charvec(&self) -> Vec { self.to_string().chars().collect::>() } } }