#include <bits/stdc++.h>
template <class T>
inline void read(T& x) {
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  if (f) x = -x;
}
template <class T>
inline T read(const T sample) {
  T x = 0;
  char c;
  bool f = 0;
  while ((c = getchar()) < '0' || '9' < c) f |= (c == '-');
  for (x = (c ^ 48); '0' <= (c = getchar()) && c <= '9';
       x = (x << 1) + (x << 3) + (c ^ 48))
    ;
  return f ? -x : x;
}
template <class T>
void fwrit(const T x) {
  if (x < 0) return (void)(putchar('-'), fwrit(-x));
  if (x > 9) fwrit(x / 10);
  putchar(x % 10 ^ 48);
}
template <class T>
inline T Max(const T x, const T y) {
  return x < y ? y : x;
}
template <class T>
inline T Min(const T x, const T y) {
  return x < y ? x : y;
}
template <class T>
inline T fab(const T x) {
  return x > 0 ? x : -x;
}
inline int gcd(const int a, const int b) { return b ? gcd(b, a % b) : a; }
inline void getInv(int inv[], const int lim, const int MOD) {
  inv[0] = inv[1] = 1;
  for (int i = 2; i <= lim; ++i)
    inv[i] = 1ll * inv[MOD % i] * (MOD - MOD / i) % MOD;
}
inline long long mulMod(const long long a, const long long b,
                        const long long mod) {
  return ((a * b - (long long)((long double)a / mod * b + 1e-8) * mod) % mod +
          mod) %
         mod;
}
const int maxn = 2000;
bool e[maxn + 5][maxn + 5];
int n;
inline void Init() {
  n = read(1);
  for (signed i = (1), i_end_ = (n); i <= i_end_; ++i)
    for (signed j = (1), j_end_ = (n); j <= j_end_; ++j) e[i][j] = read(1) > 0;
}
int st[maxn + 5], st_sz;
bool inst[maxn + 5];
int dfn[maxn + 5], low[maxn + 5], times;
int sz;
void dfs(const int u) {
  inst[st[++st_sz] = u] = true;
  dfn[u] = low[u] = ++times;
  for (signed v = (1), v_end_ = (n); v <= v_end_; ++v)
    if (e[u][v]) {
      if (!dfn[v])
        dfs(v), low[u] = Min(low[u], low[v]);
      else if (inst[v])
        low[u] = Min(low[u], dfn[v]);
    }
  if (dfn[u] == low[u]) {
    sz = 0;
    int v;
    do {
      inst[v = st[st_sz--]] = false;
      ++sz;
    } while (v ^ u);
  }
}
signed main() {
  Init();
  dfs(1);
  if (sz == n)
    puts("YES");
  else
    puts("NO");
  return 0;
}
