Pagini recente » Cod sursa (job #794804) | Cod sursa (job #1409673) | Cod sursa (job #2907872) | Cod sursa (job #1884587) | Cod sursa (job #547980)
Cod sursa(job #547980)
#include <stdio.h>
#include <map>
#include <string.h>
#include <vector>
#define NMAX 10005
#define INF 0x3f3f3f3f
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair <int,int>
using namespace std;
vector <int> A[NMAX],C[NMAX],F[NMAX];
int n,sursa,dest,Q[NMAX],dad[NMAX];
int rez,flow,fmin;
char viz[NMAX];
map <int,int> H[NMAX];
void read()
{
scanf("%d",&n);
sursa=0; dest=n*n+1;
int i,x,y,z,t;
for (i=1; i<=n*n; i++)
{
scanf("%d",&x);
rez+=x;
A[sursa].pb(i); A[i].pb(sursa);
H[sursa][i]=A[sursa].size()-1; H[i][sursa]=A[i].size()-1;
C[sursa].pb(x); C[i].pb(0);
F[sursa].pb(0); F[i].pb(0);
}
for (i=1; i<=n*n; i++)
{
scanf("%d",&x);
rez+=x;
A[i].pb(dest); A[dest].pb(i);
H[i][dest]=A[i].size()-1; H[dest][i]=A[dest].size()-1;
C[i].pb(x); C[dest].pb(0);
F[i].pb(0); F[dest].pb(0);
}
for (i=1; i<=n*n; i++)
{
scanf("%d%d%d%d",&x,&y,&z,&t);
if (i>n)
{
A[i].pb(i-n); A[i-n].pb(i);
H[i][i-n]=A[i].size()-1; H[i-n][i]=A[i-n].size()-1;
C[i].pb(x); C[i-n].pb(x);
F[i].pb(0); F[i-n].pb(0);
}
if (i % n!=1)
{
A[i].pb(i-1); A[i-1].pb(i);
H[i][i-1]=A[i].size()-1; H[i-1][i]=A[i-1].size()-1;
C[i].pb(t); C[i-1].pb(t);
F[i].pb(0); F[i-1].pb(0);
}
}
}
int BF()
{
Q[0]=1; Q[1]=sursa;
memset(viz,0,sizeof(viz));
viz[sursa]=1;
int i,j,nod,vec;
for (i=1; i<=Q[0]; i++)
{
nod=Q[i];
for (j=0; j<A[nod].size(); j++)
{
vec=A[nod][j];
if (C[nod][j]==F[nod][j] || viz[vec])
continue ;
viz[vec]=1;
Q[++Q[0]]=vec;
dad[vec]=nod;
if (vec==dest)
return 1;
}
}
return 0;
}
inline int min(int x,int y)
{
return x<y ? x : y;
}
void solve()
{
int i,nod,poz;
while (BF())
{
for (i=0; i<A[dest].size(); i++)
{
nod=A[dest][i]; poz=H[nod][dest];
if (!viz[nod] || C[nod][poz]==F[nod][poz])
continue ;
dad[dest]=nod;
fmin=INF;
for (nod=dest; nod!=sursa; nod=dad[nod])
{
poz=H[dad[nod]][nod];
fmin=min(fmin,C[dad[nod]][poz]-F[dad[nod]][poz]);
}
for (nod=dest; nod!=sursa; nod=dad[nod])
{
poz=H[dad[nod]][nod];
F[dad[nod]][poz]+=fmin;
poz=H[nod][dad[nod]];
F[nod][poz]-=fmin;
}
flow+=fmin;
}
}
}
int main()
{
freopen("pixels.in","r",stdin);
freopen("pixels.out","w",stdout);
read();
solve();
printf("%d\n",rez-flow);
return 0;
}