Cod sursa(job #180021)

Utilizator anoukAnca Dumitrache anouk Data 16 aprilie 2008 16:16:19
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <queue>
#define DIM 432
#define INF 0x3f3f3f3f
using namespace std;

int N, F, C[DIM][DIM], cost[DIM][DIM], D[DIM], tata[DIM], sel[DIM], sol, paz[DIM], npaz;

int BF(int S);

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

	fscanf(fin, "%d", &N);
	int x;
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= N; j++)
		{
			fscanf(fin, "%d", &x);
			cost[i][N + j] = x;
			cost[N + j][i] = -x;
			C[i][N + j] = 1;
		}
	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;

	//Flux
	while (BF(0))
	{
		sol += D[F];
		for (int i = F; i; i = tata[i])
		{
			C[tata[i]][i]--;
			C[i][tata[i]]++;
		}
	}
	fprintf(fout, "%d\n", sol);
	//
	for (int i = N + 1; i < F; i++)
	{
		BF(i);
		npaz = 0;
		for (int j = 1; j <= N; j++)
			if (cost[i][j] == D[j]) paz[++npaz] = j;
		fprintf(fout, "%d ", npaz);
		for (int j = 1; j <= npaz; j++)
			fprintf(fout, "%d ", paz[j]);
		fprintf(fout, "\n");
	}

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

int BF(int S)
{
	queue <int> Q;
	memset(sel, 0, sizeof(sel));
	memset(tata, 0, sizeof(tata));
	for (int i = 0; i <= F; i++)
		D[i] = INF;

	Q.push(S);
	D[S] = 0;
	sel[S] = 1;
	while (!Q.empty())
	{
		int i = Q.front();
		Q.pop();
		sel[i] = 0;
		for (int j = 0; j <= F; j++)
			if (C[i][j] && cost[i][j] + D[i] < D[j])
			{
				D[j] = cost[i][j] + D[i];
				tata[j] = i;
				if (!sel[j])
				{
					Q.push(j);
					sel[j] = 1;
				}
			}
	}

	if (!tata[F]) return 0;
	return 1;
}