Cod sursa(job #927648)

Utilizator taigi100Cazacu Robert taigi100 Data 25 martie 2013 22:15:41
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define max 10002
int n,m,k;
int d[max],r[max];
bool u[max];
vector<int> roads[max];
int pairemup(int i)
{
	if(u[i]) return 0;
	u[i]=1;
	for(vector<int>::iterator it=roads[i].begin(); it!=roads[i].end();it++)
		if(!r[*it])
		{
			d[i]=*it;
			r[*it]=i;
			return 1;
		}
	for(vector<int>::iterator it=roads[i].begin(); it!=roads[i].end();it++)
	if(pairemup(*it))
	{
		d[i]=*it;
		r[*it]=i;
		return 1;
	}
	return 0;
}
int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);

	scanf("%d %d %d",&n,&m,&k);
	int x,y;
	for(int i=1;i<=k;i++)
	{
		scanf("%d %d",&x,&y);
		roads[x].push_back(y);
	}

	int change=1;
	
	while(change)
	{
		change=0;
		memset(u,0,sizeof(u));
		for(int i=1;i<=n;i++)
			if(!d[i])
				change |= pairemup(i);
	}
	int nrcup=0;
	for(int i=1;i<=n;i++)
	nrcup+= ( d[i]>0 );
	printf("%d\n",nrcup);
	for(int i=1;i<=n;i++)
		if(d[i]>0)
			printf("%d %d\n",i,d[i]);
	return 0;
}