Cod sursa(job #161779)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 18 martie 2008 20:02:27
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <cstring>
#include <list>
using namespace std;

const int MAX = 105;
int C[MAX][MAX], F[MAX][MAX];
int T[MAX], D[MAX];
int n,i,j;

struct elem {
	int x,y,c;
	elem(int a, int b, int d) { x=a, y=b, c=d; }
};
list<elem> L;

int bf() {
	memset(D, 0x3f, sizeof(D));
	D[0] = 0;
	int ok, nr, l=L.size();
	list<elem>::iterator it;
	for (ok=nr=1; ok && nr<2*n; ++nr) 
		for (ok=0, it=L.begin(); it!=L.end(); ++it) {
			int i = it->x, j = it->y, c = it->c;
			if ( C[i][j]>F[i][j] && D[j]>D[i]+c )
				D[j] = D[i]+c, T[j] = i, ok=1;
			if ( C[j][i]>F[j][i] && D[i]>D[j]-c )
				D[i] = D[j]-c, T[i] = j, ok=1;
		}
	return D[2*n+1] < 0x3f3f3f3f;
}

int flux() {
	int f,c;
	for (f=c=0; bf(); f++, c += D[2*n+1]) {
		for (i=2*n+1; i; i=T[i])
			F[T[i]][i] ++, F[i][T[i]] --;
		memset(T, 0, sizeof(T));
	}
	return c;
}

int main() {
	freopen("cc.in", "r", stdin);
	scanf("%d", &n);
	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j) {
			int x;
			scanf("%d", &x);
			L.push_back(elem(i, n+j, x));
		}

	for (i=1; i<=n; ++i) {
		C[0][i] = C[n+i][2*n+1] = 1;
        L.push_back(elem(0, i, 0));
        L.push_back(elem(n+i, 2*n+1, 0));
		for (j=1; j<=n; ++j)
			C[i][n+j] = 1;
	}

	fprintf(fopen("cc.out","w"), "%d\n", flux());
	return 0;
}