Cod sursa(job #293700)

Utilizator blasterzMircea Dima blasterz Data 2 aprilie 2009 00:13:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
#define N 10001

struct nod
{
	int x; 
	nod *n;
};

int n1, n2, m;
int l[N], r[N];
bool use[N];

nod *a[N];

inline bool pairup(int n)
{
	if(use[n]) return 0;
	use[n]=1;
	
	for(nod *i=a[n]; i; i=i->n)
		if(!l[i->x])
		{
			l[i->x]=n;
			r[n]=i->x;
			return 1;
		}

		
	for(nod *i=a[n]; i; i=i->n)
		if(pairup(l[i->x]))
		{
			l[i->x]=n;
			r[n]=i->x;
			return 1;
		}
	return 0;
}

void solve()
{
	int ok=1;
	int i;
	int flow=0;
	int n=n1;

	while(ok)
	{
		ok=0;

		for(i=0; i <= n; ++i) use[i]=0;

		for(i=1; i <= n; ++i)
			if(!r[i])
				if(pairup(i)) ok=1,++flow;
	}

	freopen("cuplaj.out","w",stdout);
	printf("%d\n", flow);
	for(i=1; i <= n; ++i)
		if(r[i]) printf("%d %d\n", i, r[i]);
			
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	scanf("%d %d %d\n", &n1, &n2, &m);
	
	int p, q;
	
	while(m--)
	{
		scanf("%d %d\n", &p, &q);
		
		nod *t=new nod;
		t->x=q;
		t->n=a[p];
		a[p]=t;

	}
	solve();

	return 0;
}