#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3F3F3F3F;
const int NEGINF = 0xC0C0C0C0;
const double EPS = 1e-8;
int cmp(double x, double y = 0, double tol = EPS) {
  return (x <= y + tol) ? (x + tol < y) ? -1 : 0 : 1;
}
vector<int> graph[2][2010];
int mark[2010];
int N;
void dfs(int node, vector<int> graph[2010], int m) {
  if (mark[node] == m) return;
  mark[node] = m;
  for (int x : graph[node]) dfs(x, graph, m);
}
int main() {
  scanf("%d", &N);
  for (decltype(0) i = (0); i < (N); ++i)
    for (decltype(0) j = (0); j < (N); ++j) {
      int x;
      scanf("%d", &x);
      if (i != j && x > 0) graph[0][i].push_back(j);
      if (i != j && x > 0) graph[1][j].push_back(i);
    }
  memset(mark, 0, sizeof(mark));
  dfs(0, graph[0], 1);
  bool f = count(mark, mark + N, 1) == N;
  dfs(0, graph[1], 2);
  bool s = count(mark, mark + N, 2) == N;
  if (f && s)
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}
