Pagini recente » Cod sursa (job #2497638) | Cod sursa (job #465549) | Cod sursa (job #386493) | Cod sursa (job #2187643) | Cod sursa (job #561485)
Cod sursa(job #561485)
#include <stdio.h>
#include <string.h>
#include <ext/hash_map>
#include <vector>
#include <queue>
#define Nmax 10005
#define pii pair< int,int >
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define INF 2147000000
#define itt vector< pii >::iterator
using namespace std;
using namespace __gnu_cxx;
int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1};
int Q[Nmax];
vector< int > v[Nmax],F[Nmax],C[Nmax];
int prev[Nmax],sz[Nmax],vv[Nmax];
int N,S,D,sol;
hash_map <int,int> H[Nmax];
inline int Minim(int x,int y){ return x<y ? x:y;}
void citire(){
int x,i,j,ii,jj,k;
scanf("%d",&N);
S=N*N+2; D=N*N+1;
for(i=1;i<=N*N;++i){
scanf("%d",&x); sol+=x;
v[S].pb(i); C[S].pb(x); F[S].pb(0); H[S][i]=sz[S]++;
v[i].pb(S); C[i].pb(0); F[i].pb(0); H[i][S]=sz[i]++;
}
for(i=1;i<=N*N;++i){
scanf("%d",&x); sol+=x;
v[i].pb(D); C[i].pb(x); F[i].pb(0); H[i][D]=sz[i]++;
v[D].pb(i); C[D].pb(0); F[D].pb(0); H[D][i]=sz[D]++;
}
for(i=1;i<=N;++i)
for(j=1;j<=N;++j)
for(k=0;k<4;++k){
scanf("%d",&x);
ii=i+dx[k]; jj=j+dy[k];
if( ii && jj && ii<=N && jj<=N ){
v[(i-1)*N+j].pb((ii-1)*N+jj);
C[(i-1)*N+j].pb(x);
F[(i-1)*N+j].pb(0);
H[(i-1)*N+j][(ii-1)*N+jj]=sz[(i-1)*N+j]++;
}
}
}
inline int BF(){
int i,x,st=1,dr=1;
memset(prev,0,sizeof(prev));
Q[st]=S; prev[S]=-1;
while( st<=dr ){
x=Q[st++];
if( x==D ) continue;
for( i=0; i<sz[x]; ++i)
if( !prev[v[x][i]] && C[x][i]>F[x][i] ){
prev[v[x][i]]=x;
Q[++dr]=v[x][i];
}
}
return prev[D];
}
void flux(){
int i,q;
int fmin,wh;
while( BF() )
for(i=0; i<sz[D]; ++i)
if( prev[v[D][i]] ){
prev[D]=v[D][i];
fmin=INF; vv[0]=0;
for( wh=D; wh!=S; wh=prev[wh] ){
vv[++vv[0]]=H[prev[wh]][wh];
fmin=Minim(fmin, C[prev[wh]][vv[vv[0]]]-F[prev[wh]][vv[vv[0]]]);
}
if( !fmin ) continue;
for( q=1,wh=D; wh!=S; wh=prev[wh] ){
F[prev[wh]][vv[q++]] +=fmin;
if( prev[wh] != S )
F[wh][H[wh][prev[wh]]] -= fmin;
}
sol -= fmin;
}
}
int main(){
freopen("pixels.in","r",stdin);
freopen("pixels.out","w",stdout);
citire();
flux();
printf("%d\n",sol);
fclose(stdin); fclose(stdout);
return 0;
}