use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, m: usize, uv: [(Usize1, Usize1); m], l: usize, jk: [(Usize1, usize); l], } let mut graph_1 = vec![vec![]; n]; for &(u, v) in &uv { graph_1[u].push(v); graph_1[v].push(u); } let watched = bfs_1(&graph_1, &jk); if watched[0] { println!("No"); return; } let mut graph_2 = vec![vec![]; n]; for &(u, v) in &uv { if !watched[u] && !watched[v] { graph_2[u].push(v); graph_2[v].push(u); } } let dist = bfs_2(&graph_2, 0); if dist[n - 1] == 1 << 30 { println!("No"); } else { println!("Yes"); println!("{}", dist[n - 1]); } } pub fn bfs_1(graph: &Vec>, jk: &[(usize, usize)]) -> Vec { let n = graph.len(); let mut watched = vec![false; n]; let mut que = std::collections::VecDeque::new(); for &(j, k) in jk { watched[j] = true; que.push_back((j, k)); } while let Some((u, k)) = que.pop_front() { if k == 0 { continue; } for &v in &graph[u] { if watched[v] { continue; } watched[v] = true; que.push_back((v, k - 1)); } } watched } pub fn bfs_2(graph: &Vec>, s: usize) -> Vec { let inf = (1 << 30) as usize; let n = graph.len(); let mut dist = vec![inf; n]; let mut que = std::collections::VecDeque::new(); dist[s] = 0; que.push_back(s); while let Some(u) = que.pop_front() { for &v in &graph[u] { if dist[v] != inf { continue; } dist[v] = dist[u] + 1; que.push_back(v); } } dist }