Cod sursa(job #553875)

Utilizator ooctavTuchila Octavian ooctav Data 14 martie 2011 13:15:32
Problema Pixels Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<map>
#include<set>
#include<vector>
using namespace std;

const char IN[] = {"pixels.in"};
const char OUT[] = {"pixels.out"};
const int INF = 1000000005;
const double PI  = 3.14159265;
const int NMAX = 105 * 105;

#define II inline
#define LL long long
#define PII pair<int, int>
#define PDD pair<double, double>
#define fs first
#define sc second
#define mp make_pair
#define pb push_back
#define FOR(i, a, b) 	for(int i = a ; i <= b ; i++)
#define IFOR(i, a, b) 	for(int i = a ; i >= b ; i--)
#define FORIT(it, V) 	for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)
#define all(a) a, a + 

int N;
int REZ;
int S, D;
vector<int> V[NMAX], C[NMAX], F[NMAX];
map<int, int> H[NMAX];
int viz[NMAX], tata[NMAX];

void citi()
{
	scanf("%d", &N);
	S = 0; D = N*N + 1;
	FOR(i, 1, N*N)
	{
		int x;
		scanf("%d", &x);
		REZ += x;
		V[i].pb(S);V[S].pb(i);
		C[i].pb(0);C[S].pb(x);
		F[i].pb(0);F[S].pb(0);
		H[i][S] = V[i].size() - 1;
		H[S][i] = V[S].size() - 1;
	}	
	FOR(i, 1, N*N)
	{
		int x;
		scanf("%d", &x);
		REZ += x;
		V[i].pb(D);V[D].pb(i);
		C[i].pb(x);C[D].pb(0);
		F[i].pb(0);F[D].pb(0);
		H[i][D] = V[i].size() - 1;
		H[D][i] = V[D].size() - 1;
	}
	
	FOR(i, 1, N*N)
	{
		int x, y, z, t;
		scanf("%d%d%d%d", &x, &y, &z, &t);
		if(i > N)
		{			
			V[i].pb(i - N);V[i - N].pb(i);
			C[i].pb(x);C[i - N].pb(x);
			F[i].pb(0);F[i - N].pb(0);
			H[i][i - N] = V[i].size() - 1;
			H[i - N][i] = V[i - N].size() - 1;
		}
		if(i%N != 1)
		{			
			V[i].pb(i - 1);V[i - 1].pb(i);
			C[i].pb(t);C[i - 1].pb(t);
			F[i].pb(0);F[i - 1].pb(0);
			H[i][i - 1] = V[i].size() - 1;
			H[i - 1][i] = V[i - 1].size() - 1;
		}
	}
}

void write()
{
	FOR(i, 0, N*N + 1)
	{
		FORIT(it, V[i])
			printf("%d ", *it);
		printf("\n");
	}
	printf("\n\n");
	
	
	FOR(i, 0, N*N + 1)
	{
		FORIT(it, C[i])
			printf("%d ", *it);
		printf("\n");
	}
	printf("\n\n");
	
	
	FOR(i, 0, N*N + 1)
	{
		FORIT(it, F[i])
			printf("%d ", *it);
		printf("\n");
	}
	printf("\n\n");
}

bool bfs()
{
	fill(viz, viz + NMAX, 0);
	fill(tata, tata + NMAX, 0);
	queue<int> Q;
	Q.push(S);
	viz[S] = 1;
	while(!Q.empty())
	{
		int x = Q.front();
		Q.pop();
		FOR(i, 0, V[x].size() - 1)
			if(!viz[V[x][i]] && F[x][i] < C[x][i])
			{
				viz[V[x][i]] = 1;
				tata[V[x][i]] = x;
				if(V[x][i] != D)
					Q.push(V[x][i]);
			}
	}
	return viz[D];
}

void flux()
{
	while(bfs())
	{
		FOR(i, 0, V[D].size() - 1)
		{
			int nod = V[D][i];
			tata[D] = nod;
			int loc = H[nod][D];
			if(!viz[nod] || F[nod][loc] == C[nod][loc])	continue;
			
			int FLUX = INF;
			for(nod = D ; nod != S ; nod = tata[nod])
			{
				loc = H[tata[nod]][nod];
				FLUX = min(FLUX, C[tata[nod]][loc] - F[tata[nod]][loc]); 
			}
			
			for(nod = D ; nod != S ; nod = tata[nod])
			{
				loc = H[tata[nod]][nod];
				F[tata[nod]][loc] += FLUX;
				loc = H[nod][tata[nod]];
				F[nod][loc] -= FLUX;
			}
			
			REZ -= FLUX;
		}
	}
}

int main()
{
	freopen(IN, "r", stdin);
	freopen(OUT, "w", stdout);
	citi();
	//write();
	flux();
	printf("%d\n", REZ);
	return 0;
}