Cod sursa(job #129270)

Utilizator victorsbVictor Rusu victorsb Data 28 ianuarie 2008 20:59:34
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <vector>

using namespace std;

#define Nmax 256
#define pb push_back
#define sz(a) (int)((a).size())

int n, m, ct;
vector<int> lv[Nmax];
int v[Nmax], p[Nmax], dest[Nmax];
int list[Nmax][Nmax];

void citire()
{
	int i, a, b;

	scanf("%d %d\n", &n, &m);
	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d\n", &a, &b);
		lv[b].pb(a);
	}
}

int cupleaza(int nod)
{
	int i;

    v[nod] = 1;

	for (i = 0; i < sz(lv[nod]); ++i)
		if (!dest[lv[nod][i]])
		{
			p[nod] = lv[nod][i];
			dest[lv[nod][i]] = nod;
			return 1;
		}

	for (i = 0; i < sz(lv[nod]); ++i)
		if (!v[dest[lv[nod][i]]] && cupleaza(dest[lv[nod][i]]))
		{
			p[nod] = lv[nod][i];
			dest[lv[nod][i]] = nod;
			return 1;
		}

	return 0;
}

void DF(int nod)
{
	if (p[nod] != 0)
		DF(p[nod]);
	list[ct][++list[ct][0]] = nod;
}

void solve()
{
	int i, j, ok = 0;

	while (!ok)
	{
		ok = 1;
		memset(v, 0, sizeof(v));

		for (i = 1; i <= n; ++i)
			if (!p[i] && cupleaza(i))
				ok = 0;
	}

	memset(v, 0, sizeof(v));
	for (i = 1; i <= n; ++i)
		v[p[i]] = 1;
	for (i = 1; i <= n; ++i)
		if (!v[i])
		{
			++ct;
			DF(i);
		}

    printf("%d\n", ct - 1);
	for (i = 1; i < ct; ++i)
		printf("%d %d\n", list[i][list[i][0]], list[i + 1][1]);

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

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

	citire();
	solve();

	return 0;
}