Cod sursa(job #185974)

Utilizator amadaeusLucian Boca amadaeus Data 26 aprilie 2008 15:03:06
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <cstdio>
#include <queue>

#define NX 210
#define INF 0x3f3f3f3f

using namespace std;

int a[ NX ][ NX ], cap[ NX ][ NX ];
int pi[ NX ], dist[ NX ];
bool col[ NX ];
queue< int > Q;
int N, S, T;;

void cit() {
	int i, j;
	
	scanf( "%d", &N );

	for( i = 1; i <= N; i++ )
		for( j = 1; j <= N; j++ )
			scanf( "%d", &a[i][j + N] ),
			a[j+N][i] = -a[i][j+N],
			cap[i][j+N] = 1;

	S = 0, T = 2*N + 1;
	for( i = 1; i <= N; i++ )
		cap[S][i] = 1,
		cap[i+N][T] = 1;
	N = T;
}

int flow() {
	int i, u, v, fl = 0;
	
	while( 1 ) {
		for( i = 0; i <= N; i++ )
			pi[i] = -1, dist[i] = INF;

		while( !Q.empty() )
			Q.pop();

		pi[S] = -2, dist[S] = 0, col[S] = 1;
		Q.push( S );

		while( !Q.empty() ) {
			u = Q.front(), Q.pop();
			col[ u ] = 0;
			for( i = 0; i <= N; i++ )
				if( cap[u][i] )
					if( dist[i] > dist[u] + a[u][i] ) {
						dist[i] = dist[u] + a[u][i];
						pi[i] = u;
						if( col[i] == 0 )
							col[i] = 1, Q.push(i);
					}
		}

		if( pi[T] == -1 )
			break;

		for( v = T, u = pi[T]; u >= 0; v = u, u = pi[u] )
			cap[u][v]--, cap[v][u]++,
			fl += a[u][v];
	}
	return fl;
}

void scr() {
	printf( "%d\n", flow() );
}

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

	cit();
	scr();

	return 0;
}