#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> adj[2010];
vector<int> adj_[2010];
int ordem[2010];
int cur;
int jafoi[2010];
void dfs(int a) {
  jafoi[a] = true;
  for (int i = 0; i < adj[a].size(); i++) {
    if (!jafoi[adj[a][i]]) dfs(adj[a][i]);
  }
  ordem[cur] = a;
  cur++;
  return;
}
int used;
void dfs_(int a) {
  jafoi[a] = true;
  used++;
  for (int i = 0; i < adj_[a].size(); i++) {
    if (!jafoi[adj_[a][i]]) dfs_(adj_[a][i]);
  }
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      int a;
      scanf("%d", &a);
      if (a != 0) {
        adj[i].push_back(j);
        adj_[j].push_back(i);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    jafoi[i] = false;
  }
  for (int i = 0; i < n; i++) {
    if (!jafoi[i]) dfs(i);
  }
  for (int i = 0; i < n; i++) {
    jafoi[i] = false;
  }
  used = 0;
  dfs_(ordem[n - 1]);
  if (used == n)
    printf("YES");
  else
    printf("NO");
}
