Cod sursa(job #547980)

Utilizator indestructiblecont de teste indestructible Data 6 martie 2011 21:46:52
Problema Pixels Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#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;
}