Cod sursa(job #78897)

Utilizator gigi_becaliGigi Becali gigi_becali Data 20 august 2007 00:52:48
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 256
#define INFI 0x3f3f3f3f

int cost[NMAX][NMAX];
int cap[NMAX][NMAX];
int n;
int res;
int source, sink;

void read()
{
	int i, j;
	scanf("%d", &n);
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
		{
			scanf("%d", &cost[i][n+j]);
            cost[n+j][i] = -cost[i][n+j];
			++cap[i][n+j];
		}
	source = 0; 
	sink = 2*n+1;
	for(i = 1; i <= n; ++i)
		cap[source][i] = cap[i+n][sink] = 1;
}

int bf()
{
	int q[NMAX+2];
	bool viz[NMAX];
	int d[NMAX], t[NMAX];
	int inc, sf;
	int x, i;

	memset(d, INFI, sizeof(d));
	memset(viz, 0, sizeof(viz));
	d[source] = 0;
	inc = sf = 1;
	q[1] = source;
	t[source] = -1;
	
	while(inc <= sf)
	{
		x = q[inc++];
		viz[x]=0;
		inc%=NMAX;

		for(i = 0; i <= sink; ++i)
			if(cap[x][i])
				if(d[x] + cost[x][i] < d[i])
				{
					d[i] = d[x] + cost[x][i];
					t[i] = x;

					if(!viz[i]){ q[++sf] = i;viz[i]=1;sf%=NMAX;}
					
				}
	}

	if(d[sink] == INFI)
		return 0;

	for(i = sink; i != source; i = t[i])
		--cap[t[i]][i], ++cap[i][t[i]];

	return 1;
}

void solve()
{
	while(bf());

	for(int i = 1; i <= n; ++i)
		for(int j = n+1; j < sink; ++j)
			if(!cap[i][j])
				res += cost[i][j];
}

int main()
{
	freopen("cc.in", "r", stdin);
	freopen("cc.out", "w", stdout);

	read();

	solve();

	printf("%d\n", res);

	return 0;
}