Cod sursa(job #319939)

Utilizator raduzerRadu Zernoveanu raduzer Data 2 iunie 2009 21:35:51
Problema Taramul Nicaieri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <cstring>

const int MAX_N = 220;
const int INF = 0x3f3f3f3f;

int n, sol, fi, st, ch;
int c[MAX_N][MAX_N];
int f[MAX_N], up[MAX_N], q[MAX_N];

inline int min(int a, int b) { return (a < b) ? a : b; }

void bf()
{
	memset(f, 0, sizeof(f));
	memset(up, -1, sizeof(up));
	f[st] = INF;
	q[0] = st;

	int l, r, i;

	for (l = r = 0; l <= r; ++l)
	{
		int nod = q[l];

		for (i = 1; i <= 2 * n + 2; ++i)
			if (c[nod][i] && f[i] == 0)
			{
				f[i] = min(f[nod], c[nod][i]);
				up[i] = nod;
				q[++r] = i;

				if (i == fi)
				{
					l = r + 1;
					break;
				}
			}
	}

	printf("*%d\n", f[fi]);

	ch = f[fi];
	if (ch)
	{
		for (i = fi; i != st; i = up[i])  
		{  
			c[up[i]][i] -= f[fi];  
			c[i][up[i]] += f[fi];  
		}
	}
}

int main()
{
	int i, j, x, y;
	freopen("harta.in", "r", stdin);
	freopen("harta.out", "w", stdout);

	st = 2 * n + 1;
	fi = 2 * n + 2;

	scanf("%d", &n);
	
	for (i = 1; i <= n; ++i)
	{
		scanf("%d %d", &x, &y);
		sol += x;

		c[i + n][fi] = c[fi][i + n] = x;
		c[st][i] = c[i][st] = y;
	}

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

	ch = 1;
	while (ch)
	{
		bf();
	}

	printf("%d\n", sol);

	for (i = 1; i <= n; ++i)
		for (j = 1; j <= n; ++j)
			if (i != j && c[i][j + n] == 0)
				printf("%d %d\n", i, j);
}