Cod sursa(job #315747)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 17 mai 2009 01:00:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

#define Nmax 10001

#define pb push_back
#define sz size
#define Inf 1<<22

#define file_in "cuplaj.in"
#define file_out "cuplaj.out"

#define ll long long
#define ii inline

#define clear(a) memset(a,0,sizeof(a))

vector<int> v[Nmax];
int n,m,e;
int cuplaj1[Nmax];
int cuplaj2[Nmax];
int b,a,ok,nrsol;
int viz[Nmax];


ii bool cupleaza(int nod)
{
	int i;
	if (viz[nod]==1) return false;
	viz[nod]=1;
	for (i=0;i<v[nod].sz();++i)
	{
		if (cuplaj1[v[nod][i]]==0)
		{
			cuplaj2[nod]=1;
			cuplaj1[v[nod][i]]=nod;
			return true;
		}
	}
	for (i=0;i<v[nod].sz();++i)
	{
		if (cuplaj1[v[nod][i]]!=nod && cupleaza(cuplaj1[v[nod][i]]))
            {
				cuplaj2[nod]=1;
				cuplaj1[v[nod][i]]=nod;
				return true;
			}
	}
	
	return false;	
}


ii void citire()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);

	scanf("%d %d %d", &n,&m,&e);
	for (i=1;i<=e;++i)
	{
		scanf("%d %d", &a,&b);
		v[a].pb(b);
	}
}

ii void solve()
{
	int i;
	ok=1;
	while(ok)
	{
		clear(viz);
		ok=0;
		for (i=1;i<=n;++i)
		{
			if (cuplaj2[i]==0 && cupleaza(i))
			{
				ok=1;
				nrsol++;
			}
		}
	}
}

ii void scrie()
{
	int i;
	printf("%d\n", nrsol);
	for (i=1;i<=m;++i)
		if (cuplaj1[i]!=0)
			printf("%d %d\n", cuplaj1[i],i);
}

int main()
{
	citire();
	solve();
	scrie();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}