1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 #include<queue>
7 using namespace std;
8 #define Maxn 1100
9 #define INF 0xfffffff
10
11 int mymin(int x,int y) {return x<y?x:y;}
12
13 int a[Maxn],w[Maxn][Maxn];
14
15 struct node
16 {
17 int x,y,f,next,o;
18 }t[Maxn*Maxn*10];
19 int len,first[Maxn];
20
21 void ins(int x,int y,int f)
22 {
23 t[++len].x=x;t[len].y=y;t[len].f=f;
24 t[len].next=first[x];first[x]=len;t[len].o=len+1;
25 t[++len].x=y;t[len].y=x;t[len].f=0;
26 t[len].next=first[y];first[y]=len;t[len].o=len-1;
27 }
28
29 int st,ed;
30 int dis[Maxn];
31 queue<int > q;
32 bool bfs()
33 {
34 for(int i=1;i<=ed;i++) dis[i]=-1;
35 while(!q.empty()) q.pop();
36 dis[st]=0;q.push(st);
37 while(!q.empty())
38 {
39 int x=q.front();
40 for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
41 {
42 int y=t[i].y;
43 if(dis[y]==-1)
44 {
45 dis[y]=dis[x]+1;
46 q.push(y);
47 }
48 }
49 q.pop();
50 }
51 if(dis[ed]==-1) return 0;
52 return 1;
53 }
54
55 int ffind(int x,int flow)
56 {
57 if(x==ed) return flow;
58 int now=0;
59 for(int i=first[x];i;i=t[i].next) if(t[i].f>0)
60 {
61 int y=t[i].y;
62 if(dis[y]==dis[x]+1)
63 {
64 int a=ffind(y,mymin(flow-now,t[i].f));
65 t[i].f-=a;
66 t[t[i].o].f+=a;
67 now+=a;
68 }
69 if(now==flow) break;
70 }
71 if(now==0) dis[x]=-1;
72 return now;
73 }
74
75 void output()
76 {
77 for(int i=1;i<=len;i+=2)
78 {
79 printf("%d -> %d %d\n",t[i].x,t[i].y,t[i].f);
80 }printf("\n");
81 }
82
83 int ans;
84 void max_flow()
85 {
86 while(bfs())
87 {
88 ans-=ffind(st,INF);
89 // output();
90 // while(1);
91 }
92 }
93
94 int s[Maxn];
95
96 int main()
97 {
98 int n;
99 scanf("%d",&n);
100 for(int i=1;i<=n;i++) scanf("%d",&a[i]);
101 ans=0;
102 for(int i=1;i<=n;i++)
103 {
104 s[i]=0;
105 for(int j=1;j<=n;j++)
106 {
107 scanf("%d",&w[i][j]);
108 s[i]+=w[i][j];
109 ans+=w[i][j];
110 }
111 }
112
113 len=0;
114 memset(first,0,sizeof(first));
115 st=n+1;ed=st+1;
116 for(int i=1;i<=n;i++) ins(st,i,a[i]);
117 for(int i=1;i<=n;i++)
118 for(int j=i+1;j<=n;j++) {ins(i,j,2*w[i][j]);ins(j,i,2*w[i][j]);}
119 for(int i=1;i<=n;i++) ins(i,ed,s[i]);
120 // output();
121 max_flow();
122 printf("%d\n",ans);
123 return 0;
124 }