fn f(a_matrix: &Vec>, n: usize, e: usize) -> bool { for i in 0..n { if a_matrix[i][e] != i || a_matrix[e][i] != i { return false; } } for i in 0..n { let mut ok = false; for j in 0..n { ok |= a_matrix[i][j] == e && a_matrix[j][i] == e; } if !ok { return false; } } true } fn solve(scanner: &mut Scanner) { let n: usize = scanner.next(); let a_matrix: Vec> = (0..n) .map(|_| { (0..n) .map(|_| { let a = scanner.next(); a }) .collect() }) .collect(); for i in 0..n { for j in 0..n { for k in 0..n { let x = a_matrix[i][j]; let left = a_matrix[x][k]; let y = a_matrix[j][k]; let right = a_matrix[i][y]; if left != right { println!("No"); return; } } } } for e in 0..n { if f(&a_matrix, n, e) { println!("Yes"); return; } } println!("No"); } fn main() { let mut scanner = Scanner::new(); let t: usize = 1; for _ in 0..t { solve(&mut scanner); } } struct Scanner { buf: Vec, } impl Scanner { fn new() -> Self { Self { buf: vec![] } } fn next(&mut self) -> T { loop { if let Some(x) = self.buf.pop() { return x.parse().ok().expect(""); } let mut source = String::new(); std::io::stdin().read_line(&mut source).expect(""); self.buf = Self::split(source); } } fn split(source: String) -> Vec { source .split_whitespace() .rev() .map(String::from) .collect::>() } }