Cod sursa(job #422463)

Utilizator NemultumituMatei Ionita Nemultumitu Data 22 martie 2010 18:43:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <vector>
#include <cstring>
#define pb push_back
using namespace std;
vector <int> dreapta[10010],stanga[10010];
int st[10010],dr[10010];
bool v[10010];
int n,m,e,cnt;

bool cuplaj(int x)
{
	v[x]=1;
	for (int i=0;i!=dreapta[x].size();++i)
	{
		int y=dreapta[x][i];
		if (!st[y])
		{
			st[y]=x;
			dr[x]=y;
			return 1;
		}
	}
	for (int i=0;i!=dreapta[x].size();++i)
	{
		int y=dreapta[x][i];
		int x1=st[y];
		if (!v[x1]&&cuplaj(x1))
			{
				st[y]=x;
				dr[x]=y;
				return 1;
			}
	}
	return 0;
}

void citire()
{
	int x,y;
	scanf("%d%d%d",&n,&m,&e);
	while (e--)
	{
		scanf("%d%d",&x,&y);
		stanga[y].pb(x);
		dreapta[x].pb(y);
	}
}

void scrie()
{
	printf("%d\n",cnt);
	for (int i=1;i<=n;++i)
		if (dr[i])
			printf("%d %d\n",i,dr[i]);
}

int main()
{
	freopen ("cuplaj.in","r",stdin);
	freopen ("cuplaj.out","w",stdout);
	citire();
	bool k;
	do
	{
		k=0;
		memset(v,0,sizeof(v));
		for (int i=1;i<=n;++i)
			if(!v[i]&&!dr[i])
				if(cuplaj(i))
				{
					++cnt;
					k=1;
				}
	}
	while (k);
	scrie();
	return 0;
}