Cod sursa(job #228468)

Utilizator blasterzMircea Dima blasterz Data 7 decembrie 2008 12:46:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#define N 10001
#include <string>

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

nod *a[N];
int n, m, E;
int l[N], r[N];
bool use[N];

inline void add(int i, int j)
{
	nod *p=new nod;
	p->x=j;
	p->n=a[i];
	a[i]=p;
}

void read()
{
	freopen("cuplaj.in","r",stdin);
	scanf("%d %d %d\n", &n, &m, &E);
	
	int p, q;
	while(E--)
	{
		scanf("%d %d\n", &p, &q);
		add(p,q);
	}
}

inline bool pairup(int n)
{
	if(use[n]) return 0;
	use[n]=1;
	
	nod *i;
	
	for(i=a[n]; i; i=i->n)
		if(!l[i->x])
		{
			l[i->x]=n;
			r[n]=i->x;
			return 1;
		}
		
	for(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 flow=0, ok=1,i;
	
	while(ok)
	{
		ok=0;
		memset(use, 0, sizeof(use));
		for(i=1;i<=n;++i)
			if(!r[i])
				if(pairup(i)) ++flow, ok=1;
	}

	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()
{
	read();
	solve();
	return 0;
}