Cod sursa(job #567030)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 29 martie 2011 17:29:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

int i,j,n,m,e,l[10009],r[10009],u[10009];

vector<int> a[10009];

int cuplaj(int i)
{
	if(u[i]) return 0;
	u[i]=1;
	
	for(int j=0;j<a[i].size();++j)
	{
		int fiu=a[i][j];
		if(!l[fiu]||cuplaj(l[fiu]))
		{ 
			r[i]=fiu;
			l[fiu]=i;
			return 1;
		}
	}
	return 0;
}
			

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	
	scanf("%d%d%d",&n,&m,&e);
	
	for(i=1;i<=e;++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		
		a[x].push_back(y);
	}
	
	for(int ch=1;ch;)
	{
		ch=0;
		memset(u,0,sizeof(u));
		
		for(i=1;i<=n;++i) if(!r[i])
			ch |=cuplaj(i);
	}
		
	int rez=0;
	
	for(i=1;i<=n;++i) if(r[i]) rez++;
	
	printf("%d\n",rez);
	
	for(i=1;i<=n;++i) if(r[i]) printf("%d %d\n",i,r[i]);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}