Cod sursa(job #455589)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 13 mai 2010 22:49:37
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <vector>

using namespace std;

#define NMAX 10010
#define MMAX 10010

int N, M, T, cnt;
vector<int> g[NMAX];

int l[NMAX], r[MMAX], u[NMAX];

char mat[NMAX][MMAX];

int pairup(int nod, int constraint)
{
	if (u[nod])
		return 0;
	u[nod] = 1;

	for (int i = 0; i < g[nod].size(); ++i)
		if ( g[nod][i] != constraint && !r[ g[nod][i] ] )
		{
			l[ nod ] = g[nod][i];
			r[ g[nod][i] ] = nod;
			return 1;
		}

	for (int i = 0; i < g[nod].size(); ++i)
		if ( g[nod][i] != constraint && pairup(r[ g[nod][i] ], 0) )
		{
			l[ nod ] = g[nod][i];
			r[ g[nod][i] ] = nod;
			return 1;
		}

	return 0;
}

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

	cin >> N >> M >> T;

	for (int i = 1; i <= T; ++i)
	{
		int x, y;
		cin >> x >> y;
		g[x].push_back(y);
	}

	for (int i = 1; i <= N; ++i)
		if ( !l[i] )
		{
			if (!pairup(i,0))
			{
				memset(u, 0, sizeof(u));
				cnt += pairup(i,0);
			}
			else
				++cnt;
		}

	cout << cnt << "\n";
	for (int i = 1; i <= N; ++i)
		if ( l[i] )
		{
			cout << i << " " << l[i] << "\n";
		}

	return 0;
}