use std::collections::HashSet; use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, m: usize, k: usize, a: [Usize1; k], t: [[usize; n]; n] } let mut visited = HashSet::new(); let ans = (0..n).map(|x| dfs(x, n, &t, &a, m, 0, &mut visited)) .min().unwrap(); if let Some(ans) = ans { println!("{}", ans); } else { println!("-1"); } } fn dfs(x: usize, n: usize, t: &[Vec], a: &[usize], m: usize, c: usize, visited: &mut HashSet) -> Option { if !visited.insert(x) { return None; } if visited.len() == m { visited.remove(&x); return Some(c + a.iter().copied().map(|a| t[x][a]).min().unwrap()); } let ans = (0..n) .filter(|&i| i != x) .filter_map(|i| dfs(i, n, t, a, m, c + t[x][i], visited)).min(); visited.remove(&x); ans }