Cod sursa(job #421060)

Utilizator ilincaSorescu Ilinca ilinca Data 21 martie 2010 00:54:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#include <vector>
#include <string.h>

#define nmax 10005

using namespace std;

int cp, n, m, e, b [nmax], c [nmax];
vector <int> a [nmax];
bool v [nmax];

void scan ()
{
	int i, x, y;
	scanf ("%d%d%d", &n, &m, &e);
	for (i=1; i <= e; ++i)
	{
		scanf ("%d%d", &x, &y);
		a [x].push_back (y);
	}
}

bool pairup (int x)
{
	v [x]=true;
	int i;
	for (i=0; i != a [x].size (); ++i)
		if (!c [a [x] [i]])
		{
			c [a [x] [i]]=x;
			b [x]=a [x] [i];
			return true;
		}
	for (i=0; i != a [x].size (); ++i)
		if (!v [c [a [x] [i]]] && pairup (c [a [x] [i]]))
		{
			c [a [x] [i]]=x;
			b [x]=a [x] [i];
			return true;			
		}
	return false;
}

void cuplaj ()
{
	int k, i;
	do
	{
		k=0;
		memset (v, 0, sizeof (v));
		for (i=1; i <= n; ++i)
			if (!b [i])
			{
				if (pairup (i))
				{
					++cp;
					k=1;
				}
			}
	} while (k);
}

void print ()
{
	printf ("%d\n", cp);
	int i;
	for (i=1; i <= n; ++i)
		if (b [i] != 0) printf ("%d %d\n", i, b [i]);
}

int main ()
{
	freopen ("cuplaj.in", "r", stdin);
	freopen ("cuplaj.out", "w", stdout);
	scan ();
	cuplaj ();
	print ();
	return 0;
}