fn main() { println!("{}", if solve() { "Yes" } else { "No" }); } fn solve() -> bool { let n = { let mut line = String::new(); std::io::stdin().read_line(&mut line).unwrap(); line.trim().parse::().unwrap() }; let mut mat = vec![]; for _ in 0..n { let mut line = String::new(); std::io::stdin().read_line(&mut line).unwrap(); mat.push( line.split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(), ); } for i in 0..n { for j in 0..n { for k in 0..n { if mat[mat[i][j]][k] != mat[i][mat[j][k]] { return false; } } } } let e = (0..n).find(|&x| (0..n).all(|i| mat[i][x] == i && mat[x][i] == i)); let e = if let Some(e) = e { e } else { return false; }; (0..n).all(|i| (0..n).any(|x| mat[i][x] == e && mat[x][i] == e)) }