Cod sursa(job #443322)

Utilizator IlieeUngureanu Ilie Iliee Data 16 aprilie 2010 18:31:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
#include<vector>
using namespace std;
void read(),solve();
int creste(int nod),n,m,e,x,y,i,ok,C,S[10010],D[10010],V[10010];
vector<int> v[10010];
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
	for(;e;e--)
	{
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
	}
}
void solve()
{
	ok=1;
	while(ok)
	{
		ok=0;
		for(i=1;i<=n;i++)
			V[i]=0;
		for(i=1;i<=n;i++)
			if(!D[i]&&creste(i))
			{
				C++;
				ok=1;
			}
	}
	printf("%d\n",C);
	for(i=1;i<=n;i++)
		if(D[i])
			printf("%d %d\n",i,D[i]);
}
int creste(int nod)
{
	vector<int>::iterator it;
	if(V[nod])
		return 0;
	V[nod]=1;
	for(it=v[nod].begin();it!=v[nod].end();it++)
		if(!S[*it])
		{
			D[nod]=*it;
			S[*it]=nod;
			return 1;
		}
	for(it=v[nod].begin();it!=v[nod].end();it++)
		if(creste(S[*it]))
		{
			D[nod]=*it;
			S[*it]=nod;
			return 1;
		}
	return 0;
}