1 #include<cstdio>
2 #include<iostream>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 #define maxn 1005
7 #define maxm 6000000
8 #define inf 4557430888798830399LL
9 using namespace std;
10 typedef long long int64;
11 char ch;
12 bool ok;
13 void read(int &x){
14 for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
15 for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
16 if (ok) x=-x;
17 }
18 void read(int64 &x){
19 for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
20 for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
21 if (ok) x=-x;
22 }
23 int n;
24 int64 sum,x;
25 struct flow{
26 int s,t,tot,now[maxn],son[maxm],pre[maxm];
27 int64 val[maxm];
28 int dis[maxn],head,tail,list[maxn];
29 bool bo[maxn];
30 void init(){s=0,t=n+1,tot=1,memset(now,0,sizeof(now));}
31 void put(int a,int b,int64 c){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c;}
32 void add(int a,int b,int64 c){put(a,b,c),put(b,a,0);}
33 bool bfs(){
34 memset(bo,0,sizeof(bo));
35 head=0,tail=1,list[1]=s,dis[s]=0,bo[s]=1;
36 while (head<tail){
37 int u=list[++head];
38 for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
39 if (val[p]&&!bo[v]) bo[v]=1,dis[v]=dis[u]+1,list[++tail]=v;
40 }
41 return bo[t];
42 }
43 int64 dfs(int u,int64 rest){
44 if (u==t) return rest;
45 int64 ans=0;
46 for (int p=now[u],v=son[p];p&&rest;p=pre[p],v=son[p])
47 if (val[p]&&dis[v]==dis[u]+1){
48 int64 d=dfs(v,min(rest,val[p]));
49 val[p]-=d,val[p^1]+=d,ans+=d,rest-=d;
50 }
51 if (!ans) dis[u]=-1;
52 return ans;
53 }
54 int64 dinic(){
55 int64 ans=0;
56 while (bfs()) ans+=dfs(s,inf);
57 return ans;
58 }
59 }f;
60 int main(){
61 read(n),f.init();
62 for (int i=1;i<=n;i++) read(x),f.add(f.s,i,x<<1);
63 for (int i=1;i<=n;i++) for (int j=1;j<=n;j++){
64 read(x);
65 if (i>j){
66 sum+=(x<<1);
67 f.add(i,j,x<<2),f.add(j,i,x<<2);
68 f.add(i,f.t,x<<1),f.add(j,f.t,x<<1);
69 }
70 }
71 printf("%lld\n",sum-(f.dinic()>>1));
72 return 0;
73 }