Cod sursa(job #183989)

Utilizator anoukAnca Dumitrache anouk Data 22 aprilie 2008 20:55:34
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>

#define DIM 222
#define INF 100000

using namespace std;

int N, A[DIM][DIM], C[DIM][DIM], cost[DIM][DIM], F, D[DIM], sel[DIM], sol, tata[DIM], flux[DIM][DIM];

bool BF()
{
	memset(tata, -1, sizeof(tata));
	for (int i = 1; i <= F; i++)
		D[i] = INF;
	int ok = 1;
	for (int k = 0; k <= F && ok; k++)
	{
		ok = 0;
		for (int i = 0; i <= F; i++)
			for (int j = 0; j <= F; j++)
				if (C[i][j] - flux[i][j] > 0)
				{
					if (flux[i][j] == 0 && D[j] > D[i] + cost[i][j])
					{
						D[j] = D[i] + cost[i][j];
						tata[j] = i;
						ok = 1;
					}
					if (flux[i][j] == -1 && D[j] > D[i] - cost[i][j])
					{
						D[j] = D[i] - cost[i][j];
						tata[j] = i;
						ok = 1;
					}
				}
	}

	if (tata[F] == -1) return false;
	return true;
}

int main()
{
	FILE *fin = fopen("cc.in", "r");
	FILE *fout = fopen("cc.out", "w");

	fscanf(fin, "%d", &N);
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
		{
			fscanf(fin, "%d", &A[i][j]);
			C[i][N + j] = 1;
			cost[i][N + j] = cost[N + j][i] = A[i][j];
		}
	F = 2 * N + 1;
	for (int i = 1; i <= N; i++)
		C[0][i] = 1;
	for (int i = N + 1; i < F; i++)
		C[i][F] = 1;

	while (BF())
	{
		sol += D[F];
		for (int i = F; i; i = tata[i])
		{
			flux[tata[i]][i]++;
			flux[i][tata[i]]--;
		}
	}
	
	fprintf(fout, "%d\n", sol);

	fclose(fin);
	fclose(fout);
	return 0;
}