Cod sursa(job #547152)

Utilizator ooctavTuchila Octavian ooctav Data 5 martie 2011 22:11:33
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;

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

#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 cost[NMAX][NMAX], C[NMAX][NMAX], F[NMAX][NMAX];
vector<int> Graf[NMAX];
int in_coada[NMAX], drum[NMAX], tata[NMAX];
int REZ = 0;

void citi()
{
	scanf("%d", &N);
	FOR(i, 1, N)
		FOR(j, 1, N)
		{
			scanf("%d", &cost[i][N + j]);
			cost[N + j][i] = -cost[i][N + j];
			C[i][N + j] = 1;
			Graf[i].pb(N + j);
			Graf[N + j].pb(i);
		}
	FOR(i, 1, N)
	{
		C[0][i] = 1;		
		Graf[0].pb(i);
		Graf[i].pb(0);
		
		C[N + i][2 * N + 1] = 1;
		Graf[N + i].pb(2 * N + 1);
		Graf[2 * N + 1].pb(N + i);
	}
}

bool bfs()
{
	fill(in_coada, in_coada + NMAX, 0);
	fill(drum + 1, drum + NMAX, INF);
	fill(tata + 1, tata + NMAX, 0);//nu neaparat
	
	queue<int> Q;
	Q.push(0);
	in_coada[0] = 1;
	
	while(!Q.empty())
	{
		int x = Q.front();
		Q.pop();
		in_coada[x] = 0;
		
		FORIT(it, Graf[x])
			if(F[x][*it] < C[x][*it] && drum[x] + cost[x][*it] < drum[*it])
			{
				drum[*it] = drum[x] + cost[x][*it];
				tata[*it] = x;
				if(!in_coada[*it])
				{
					Q.push(*it);
					in_coada[*it] = 1;
				}
			}
	}
	
	return drum[2 * N + 1] != INF;
}

int flux()
{
	while(bfs())
	{
		REZ += drum[2 * N + 1];
		for(int nod = 2 * N + 1 ; nod ; nod = tata[nod])
		{
			F[tata[nod]][nod]++;
			F[nod][tata[nod]]--;
		}
	}
	return REZ;
}

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