Cod sursa(job #407367)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 2 martie 2010 11:43:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<string.h>
#define Nmx 10005
#include<vector>

using namespace std;

int n,m,T,l[Nmx],r[Nmx],viz[Nmx];
vector<int> G[Nmx];


void citire()
{
	scanf("%d%d%d",&n,&m,&T);
	int x,y;
	for(;T;--T)
	{
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
	}
}

int pairup(int nod)
{
	if(viz[nod])
		return 0;
	viz[nod]=1;
	for(int i=0;i<G[nod].size();++i)
		if(!r[G[nod][i]])
		{
			l[nod]=G[nod][i];
			r[G[nod][i]]=nod;
			return 1;
		}
	for(int i=0;i<G[nod].size();++i)
		if(pairup(r[G[nod][i]]))
		{
			r[G[nod][i]]=nod;
			l[nod]=G[nod][i];
			return 1;
		}
	
	return 0;
}

void solve()
{
	int ok=0,cuplaj=0;
	do
	{
		ok=0;
		memset(viz,0,sizeof(viz));
		for(int i=1;i<=n;++i)
		if(!l[i]&&pairup(i))
		{
			cuplaj++;
			ok=1;
		}
	}while(ok);
	printf("%d\n",cuplaj);
	for(int i=1;i<=n;++i)
		if(l[i])
			printf("%d %d\n",i,l[i]);
}

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