#include <bits/stdc++.h>   using namespace std;   struct arc_t {     int u, v, c;     arc_t(int _u, int _v, int _c) : u(_u), v(_v), c(_c) {}     bool operator<(const arc_t& rhs) const { return c < rhs.c; }   };   int pa[2001];   void set_init(int n) {     for (int i = 1; i <= n; i++) pa[i] = i;   }   int set_find(int x) { return pa[x] == x ? x : pa[x] = set_find(pa[x]); }   int set_union(int x, int y) {     x = set_find(x);     y = set_find(y);     if (x == y) {       return -1;     }     pa[y] = x;     return 0;   }   int f[2001][2001];   vector<pair<int, int> > G[2001];   long long d[2001][2001];   int root;   vector<bool> mark;   int dfs(int u) {     mark[u] = true;     for (vector<pair<int, int> >::iterator i = G[u].begin(); i != G[u].end();          i++) {       int v = i->first;       if (!mark[v]) {         d[root][v] = d[root][u] + i->second;         dfs(v);       }     }   }   int getd(int _r) {     root = _r;     mark.clear();     mark.resize(2001, false);     d[_r][_r] = 0;     dfs(_r);   }   int main() {     int n;     scanf( %d , &n);     for (int i = 1; i <= n; i++)       for (int j = 1; j <= n; j++) scanf( %d , &f[i][j]);     vector<arc_t> arc;     arc.reserve(n * n / 2 + 1);     for (int i = 1; i <= n; i++) {       if (f[i][i]) {         puts( NO );         return 0;       }       for (int j = i + 1; j <= n; j++) {         if (!f[i][j] || f[i][j] != f[j][i]) {           puts( NO );           return 0;         }         arc.push_back(arc_t(i, j, f[i][j]));       }     }     sort(arc.begin(), arc.end());     set_init(n);     for (vector<arc_t>::iterator it = arc.begin(); it != arc.end(); it++) {       if (!set_union(it->u, it->v)) {         G[it->u].push_back(make_pair(it->v, it->c));         G[it->v].push_back(make_pair(it->u, it->c));       }     }     for (int i = 1; i <= n; i++) {       getd(i);     }     for (int i = 1; i <= n; i++)       for (int j = 1; j <= n; j++)         if (d[i][j] != f[i][j]) {           puts( NO );           return 0;         }     puts( YES );     return 0;   }   