Cod sursa(job #541241)

Utilizator cosmyoPaunel Cosmin cosmyo Data 24 februarie 2011 22:09:03
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N = 205;
const int INF = 0x3f3f3f3f;
int a[N][N], g[N][N], c[N][N], n, S, D, f[N][N];
queue<int> q;
int BELLMAN_FORD() {
	int i, k, r;
	int v[N], cmin[N], t[N];
	for(i = S; i <= D; ++i) {
		v[i] = t[i] = 0;
		cmin[i] = INF;
	}
	v[S] = 1;
	cmin[S] = 0;
	q.push(S);

	while(!q.empty()) {
		k = q.front();
		for(i = 1; i <= D; ++i)
			if( a[k][i] && f[k][i] < c[k][i] && cmin[k] + g[k][i] < cmin[i]) {
				cmin[i] = cmin[k] + g[k][i];
				t[i] = k;
				if(!v[i]) {
					q.push(i);
					v[i] = 1;
				}
			}
		v[k] = 0;
		q.pop(); 
	}

	if(cmin[D] != INF) {
		r = INF;
		k = D;
		while(k != S) {
			r = min(r, c[t[k]][k] - f[t[k]][k]);
			k = t[k];
		}
		k = D;

		while(k != S) {
			f[k][t[k]] -= r;
			f[t[k]][k] += r;
			k = t[k];
		}
		return cmin[D] * r;
	}

	return 0;
}

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

	scanf("%d", &n);
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
			scanf("%d", &g[i][j + n]), g[j + n][i] = -g[i][j + n];

	for(i = 1; i <= n; ++i)
		for(j = 1; j <= n; ++j)
			a[i][n + j] = 1, a[n + j][i] = 1, c[i][n + j] = 1;
	S = 0;
	D = 2 * n + 1;
	for(i = 1; i <= n; ++i)
		a[S][i] = 1, a[i][S] = 1, c[S][i] = 1, a[n + i][D] = 1, a[D][n + i] = 1, c[n + i][D] = 1;
	
	int x = 1, s = 0;
	while(x) {
		x = BELLMAN_FORD();
		s += x;
	}

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

	return 0;
}