Cod sursa(job #191391)

Utilizator scvalexAlexandru Scvortov scvalex Data 26 mai 2008 16:07:10
Problema Cc Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

const int oo = 0x3f3f3f3f;

int N;
int C[201][201];
int R[201][201];
int V[201];
int up[201];
bool U[201];
int D[201];

int src, dest;

void printM()
{
	for (int i(0); i <= 2*N+1; ++i) {
		for (int j(0); j <= 2*N+1; ++j)
			cout << R[i][j] << " ";
		cout << endl;
	}
	cout << endl;
}

bool augment()
{
	memset(U, 0, sizeof(U));
	memset(D, 0x3f, sizeof(D));
	D[src] = 0;

	while (true) {
		int min = oo;
		int pos = -1;

		for (int i(0); i <= dest; ++i)
			if ((min > D[i]) && !U[i]) {
				min = D[i];
				pos = i;
			}

		if (pos == -1)
			break;

		U[pos] = true;
		for (int i(0); i <= dest; ++i)
			if ((D[i] > D[pos] + C[pos][i] + V[pos] - V[i]) && (R[pos][i] > 0)) {
				D[i] = D[pos] + C[pos][i] + V[pos] - V[i];
				up[i] = pos;
			}
	}

	for (int i(0); i <= dest; ++i)
		V[i] += D[i];

	return D[dest] != oo;
}

int main(int argc, char *argv[]) 
{
	FILE *fi = fopen("cc.in", "r");
	fscanf(fi, "%d", &N);
	for (int i(1); i <= N; ++i)
		for (int j = N+1; j <= 2*N; ++j) {
			fscanf(fi, "%d", &C[i][j]);
			C[j][i] = -C[i][j];
			R[i][j] = 1;
		}
	fclose(fi);

	src = 0;
	dest = 2*N+1;

	for (int i(1); i <= N; ++i)
		R[src][i] = 1;
	for (int i = N+1; i <= 2*N; ++i)
		R[i][dest] = 1;

	int res(0);
	while (augment()) {
		for (int i = dest; i != src; i = up[i]) {
			--R[up[i]][i];
			++R[i][up[i]];
		}
		res += V[dest];
	}

	ofstream fout("cc.out");
	fout << res << endl;
	fout.close();

	return 0;
}