Cod sursa(job #191415)

Utilizator scvalexAlexandru Scvortov scvalex Data 26 mai 2008 17:47:59
Problema Cc Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include <fstream>

using namespace std;

const int oo = 0x3f3f3f3f;
const int MOD = 500;

int N;
int C[201][201];
bool R[201][201];
int V[201];
int up[201];
bool U[201];
int D[201];
int q[MOD];
bool inq[MOD];
int begq, endq;

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]) {
				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;
}*/

bool augment()
{
	memset(inq, 0, sizeof(inq));
	memset(D, 0x3f, sizeof(D));
	begq = endq = 0;

	inq[src] = true;
	D[src] = 0;
	q[endq++] = src;

	while (begq != endq) {
		int pos = q[begq];

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

				if (!inq[i]) {
					inq[i] = true;
					
					q[endq] = i;
					++endq;
					if (endq >= MOD)
						endq -= MOD;
				}
			}

		inq[pos] = false;
		++begq;
		if (begq >= MOD)
			begq -= MOD;
	}

	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] = true;
		}
	fclose(fi);

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

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

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

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

	return 0;
}