1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include <bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define per(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; const int N=2000005; int n,m; int mp[2005][2005]; struct edge{ int u,v,w; }e[N]; int fa[2005]; int dis[2005][2005]; int find(int x) {return fa[x]==x?fa[x]:fa[x]=find(fa[x]);} bool cmp(edge a,edge b) { return a.w<b.w; } int target[4005],pre[4005],last[2005],w[4005],tot=0; void add(int u,int v,int ww) { target[++tot]=v; pre[tot]=last[u]; last[u]=tot; w[tot]=ww; } bool used[N]; void dfs(int u,int fa,int fir) { for(int ptr=last[u];ptr;ptr=pre[ptr]) { if(target[ptr]!=fa) { dis[fir][target[ptr]]=dis[fir][u]+w[ptr]; dfs(target[ptr],u,fir); } } } int main() { scanf("%d",&n); bool flg=1; rep(i,1,n) rep(j,1,n) { int w; scanf("%d",&w); if(w!=0) flg=0; if(i<j) e[++m].u=i,e[m].v=j,e[m].w=w,mp[i][j]=mp[j][i]=w; else if(i==j){ if(w!=0) {puts("NO");return 0;} } else { if(mp[i][j]!=w) {puts("NO");return 0;} } } if(flg&&n!=1) {puts("NO");return 0;} rep(i,1,n) fa[i]=i; sort(e+1,e+m+1,cmp); rep(i,1,m) { int u=find(e[i].u),v=find(e[i].v); if(u!=v) { add(e[i].u,e[i].v,e[i].w); add(e[i].v,e[i].u,e[i].w); fa[u]=v; used[i]=1; } } rep(i,1,n) dfs(i,0,i); rep(i,1,m) if(!used[i]) { int u=e[i].u,v=e[i].v; if(dis[u][v]!=e[i].w) {puts("NO");return 0;} } puts("YES"); return 0; }
|