Cod sursa(job #667672)

Utilizator valentina506Moraru Valentina valentina506 Data 23 ianuarie 2012 16:45:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#include<vector>
using namespace std;
int n,m,i,j,e,l[100001],r[100001],uz[100001],x,y,rez,ok;
vector<int> b[100001];

int cupleaza(int x)
{
	int i;
	if(uz[x]==1)
		return 0;
	
	uz[x]=1;
	for(i=0;i<b[x].size();++i)
		if(!r[b[x][i]])
		{
			l[x]=b[x][i];
			r[b[x][i]]=x;
			return 1;
		}
		
		for(i=0;i<b[x].size();++i)
			if(cupleaza(r[b[x][i]]))
			{
				l[x]=b[x][i];
			    r[b[x][i]]=x;
			    return 1;
			}
			
			return 0;
}


void init()
{
	for(int i=1;i<=n;++i)
		uz[i]=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)
	{
		scanf("%d%d",&x,&y);
		b[x].push_back(y+n);
		b[y+n].push_back(x);
	}
	
	while(!ok)
	{
		ok=1;
		init();
		for(i=1;i<=n;++i)
			if(!l[i]&&cupleaza(i))
				ok=0;
	}
	
	for(i=1;i<=n;++i)
		if(l[i])
			rez++;
		
		printf("%d\n",rez);
		for(i=1;i<=n;++i)
			if(l[i])
				printf("%d %d\n",i,l[i]-n);
			return 0;
}