#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define INF 100000000 int sum,n,x,s,t,tot,head[800030],iter[800030],level[800030],q[800030]; struct edge{int v,cap,rev,nxt;}E[3000030]; void add(int x,int y,int k){ E[++tot].v=y; E[tot].cap=k; E[tot].rev=tot+1; E[tot].nxt=head[x]; head[x]=tot; E[++tot].v=x; E[tot].cap=0; E[tot].rev=tot-1; E[tot].nxt=head[y]; head[y]=tot; } void bfs(int s){ memset(level,-1,sizeof level); int t=0,w=1; level[s]=0; q[1]=s; while (t<w){ t++; int v=q[t]; for (int i=head[v];i;i=E[i].nxt){ edge &e=E[i]; if (e.cap>0 && level[e.v]<0){ level[e.v]=level[v]+1; q[++w]=e.v; } } } } int dfs(int v,int t,int f){ if (v==t) return f; for (int &i=iter[v];i;i=E[i].nxt){ edge &e=E[i]; if (e.cap>0 && level[v]<level[e.v]){ int d=dfs(e.v,t,min(f,e.cap)); if (d>0){ e.cap-=d; E[e.rev].cap+=d; return d; } } } return 0; } int dinic(int s,int t){ int flow=0; for(;;){ bfs(s); if (level[t]<0) return flow; for (int i=1;i<=2*n*n+1;i++) iter[i]=head[i]; int f=0; while ((f=dfs(s,t,INF))>0) flow+=f; } } int main(){ scanf("%d",&n); s=2*n*n; t=2*n*n+1; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++){ scanf("%d",&x); sum+=x; add(s,i*n+j+n,x); add(i*n+j+n,i,INF); add(i*n+j+n,j,INF); } for (int i=1;i<=n;i++){ scanf("%d",&x); add(i,t,x); } printf("%d\n",sum-dinic(s,t)); return 0; }
|