Cod sursa(job #301332)

Utilizator raduzerRadu Zernoveanu raduzer Data 8 aprilie 2009 09:43:57
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int MAX_N = 10100;

int n, m, e, ok, sol;
int f[2 * MAX_N], c[2 * MAX_N];
vector <int> v[MAX_N];

void df(int nod)
{	
	if (f[nod]) return;
	f[nod] = 1;
	
	if (nod <= n)
	{
		for (vector <int> :: iterator it = v[nod].begin(); it != v[nod].end(); ++it)
		{
			df(*it);
			
			if (ok) 
			{
				c[*it] = nod;
				return;
			}
		}
	}
	else
		if (!c[nod])
		{
			ok = 1;
			return;
		}
		else df(c[nod]);
}

int main()
{
	int i, x, y;
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
	
	scanf("%d %d %d", &n, &m, &e);
	
	for (i = 1; i <= e; ++i)
	{
		scanf("%d %d", &x, &y);
		v[x].push_back(y + n);
	}
	
	for (i = 1; i <= n; ++i)
	{
		memset(f, 0, sizeof(f));
		ok = 0;
		df(i);
		sol += ok;
	}
	
	printf("%d\n", sol);
	for (i = n + 1; i <= n + m; ++i)
		if (c[i]) printf("%d %d\n", c[i], i - n);
}