Cod sursa(job #148949)

Utilizator victorsbVictor Rusu victorsb Data 5 martie 2008 03:08:00
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <cstring>

#define Nmax 405

int n;
int cost[Nmax][Nmax];
int c[Nmax][Nmax];
int Q[Nmax * Nmax];
int d[Nmax * Nmax];
int t[Nmax];
int v[Nmax];
int sol[Nmax];

void citire()
{
	int i, j;

	scanf("%d\n", &n);
	for (i = 1; i <= n; ++i)
		for (j = 1; j <= n; ++j)
		{
			scanf("%d", &cost[i][n + j]);
			cost[n + j][i] = - cost[i][n + j];
		}
}

int BF(int s)
{
	int st = 0, dr = 1, nod, i;

	memset(v, 0, sizeof(v));
	memset(t, -1, sizeof(t));
	memset(d, 0x3f, sizeof(d));

	v[s] = 1;
	Q[dr] = s;
	d[s] = 0;

	while (st < dr)
	{
		nod = Q[++st];
		v[nod] = 0;

		for (i = 0; i <= 2 * n + 1; ++i)
			if (c[nod][i] && d[i] > d[nod] + cost[nod][i])
			{
				d[i] = d[nod] + cost[nod][i];
				t[i] = nod;
				if (!v[i])
				{
					Q[++dr] = i;
					v[i] = 1;
				}
			}
	}

	return t[2 * n + 1] != -1;
}

void flux()
{
	int nod, cnt = 0;;

	while(BF(0))
	{
		cnt += d[2 * n + 1];
		for (nod = 2 * n + 1; t[nod] != -1; nod = t[nod])
		{
			--c[t[nod]][nod];
			++c[nod][t[nod]];
		}
	}

	printf("%d\n", cnt);
}

void solve()
{
	int i, j, ct;

	for (i = 1; i <= n; ++i)
		c[0][i] = c[i + n][2 * n + 1] = 1;

	for (i = 1; i <= n; ++i)
		for (j = 1; j <= n; ++j)
			c[i][j + n] = 1;

	flux();

	for (i = 1; i <= n; ++i)
	{
		BF(i + n);

		ct = 0;
		for (j = 1; j <= n; ++j)
			if (cost[j][i + n] + d[j] == 0)
				sol[++ct] = j;

		printf("%d ", ct);
		for (j = 1; j <= ct; ++j)
			printf("%d ", sol[j]);
		printf("\n");
	}
}

int main()
{
	freopen("paznici2.in", "r", stdin);
	freopen("paznici2.out", "w", stdout);

	citire();
	solve();

	return 0;
}