Cod sursa(job #579642)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 12 aprilie 2011 12:36:25
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#define INF 0x3f3f3f3
#define MAXN 250
using namespace std;

bitset <MAXN> viz;
vector <int> G[MAXN];
int matFlux[MAXN][MAXN], matCost[MAXN][MAXN], D[MAXN], matCap[MAXN][MAXN];
int dad[MAXN], source, dest, N;
inline bool BF ()
{
	queue <int> Q;
	viz.reset ();
	for (int i = 1; i <= dest; i++) {
		D[i] = INF;
		dad[i] = 0;
	}

	D[source] = 0;
	Q.push (source);
	int nod;
	while (!Q.empty ()) {

		nod = Q.front ();
		Q.pop ();
		viz[nod] = 0;
		for (vector <int> :: iterator it = G[nod].begin (); it != G[nod].end (); it++) 
			if (D[*it] > D[nod] + matCost[nod][*it] && matCap[nod][*it] > matFlux[nod][*it]) {
				D[*it] = D[nod] + matCost[nod][*it];
				dad[*it] = nod;
				if (viz[*it] == 0) {
					viz[*it] = 1;
					Q.push (*it);
				}
			}
	}
	return D[dest] != INF;
}
int main ()
{

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

	int i, j;
	scanf ("%d\n", &N);
	
	source = 1;
	dest = 2 * N + 2;
	for (i = 2; i <= N + 1; i++) {
		G[source].push_back (i);
		G[i].push_back (source);
		matCap[source][i] = 1;
		for (j = N + 2; j <= 2 * N + 1; j++) {
			scanf ("%d", &matCost[i][j]);

			matCost[j][i] = - matCost[i][j];
			
			G[i].push_back (j);
			G[j].push_back (i);

			matCap[i][j] = 1;
			
			G[dest].push_back (j);
			G[j].push_back (dest);

			matCap[j][dest] = 1;
		}
	}
	
	int flowcost = 0, fmin;
	
	while (BF ()) {
		fmin = INF;
		for (i = dest; i != source; i = dad[i])
			fmin = min (fmin, matCap[dad[i]][i] - matFlux[dad[i]][i]);
		
		for (i = dest; i != source; i = dad[i]) {
			matFlux[dad[i]][i] += fmin;
			matFlux[i][dad[i]] -= fmin;
		}
		flowcost += fmin * D[dest];
	}
	printf ("%d\n", flowcost);
	return 0;
}