#include<cstdio>#include<algorithm>#include<cstring>
using namespace std;
const int maxn=1010,Inf=0x7fffffff/3;
int n,s,x,tot=1,ans=0;
struct edge{
int to,next,w;
}G[maxn*10];
int h[maxn],q[maxn*10],cur[maxn],vis[maxn];
void add(intx,inty,int z){
++tot; G[tot].to=y;
G[tot].w=z;
G[tot].next=h[x]; h[x]=tot;
}
bool bfs(){
memset(vis,-1,sizeof(vis));
int head=1;
int t=1,now;
q[1]=1; vis[1]=0;
while (head<=t){
now=q[head];head++;
for (int i=h[now];i;i=G[i].next)
if (vis[G[i].to]==-1&&G[i].w>0){
vis[G[i].to]=vis[now]+1;
q[++t]=G[i].to;
}
}
return vis[n]!=-1;
}
int dfs(intx,int f){
if (x==n) return f;
int w,used=0;
for (int i=cur[x];i;i=G[i].next)
if (vis[G[i].to]==vis[x]+1){
w=f-used;
w=dfs(G[i].to,min(w,G[i].w));
G[i].w-=w; G[i^1].w+=w;
if (G[i].w>0) cur[x]=i;
used+=w;
if (used==f) return f;
}
if (!used) vis[x]=-1;
return used;
}
void dinic(){
ans=0;
while (bfs()){
for (int i=1;i<=n;++i) cur[i]=h[i];
ans+=dfs(1,Inf);
}return;
}
int main()
{
freopen("maxflowa.in","r",stdin);
freopen("maxflowa.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j){
intx;
scanf("%d",&x);
if (x>0){
add(i,j,x);
add(j,i,0);
}
}
dinic();
printf("%d",ans);
return0;
}