Cod sursa(job #305229)

Utilizator FlorianFlorian Marcu Florian Data 16 aprilie 2009 18:36:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
#define MAX_N 10003
vector<int>A[MAX_N];
int N,M,E;
int viz[MAX_N];
int stanga[MAX_N], dreapta[MAX_N];
void read()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d",&N,&M,&E);
	int i,x,y;
	for(i=1;i<=E;++i)
	{
		scanf("%d%d",&x,&y);
		A[x].push_back(y);
	}
}
inline bool pairUp(int x)
{
	if(viz[x]) return 0;
	viz[x] = 1;
	int i, y;
	for(i=0; i<A[x].size(); ++i)
	{
		y = A[x][i];
		if(!stanga[y])
		{
			stanga[y] = x;
			dreapta[x] = y;
			return 1;
		}
	}
	for(i=0; i<A[x].size(); ++i)
	{
		y = A[x][i];
		if(pairUp(stanga[y]))
		{
			stanga[y] = x;
			dreapta[x] = y;
			return 1;
		}
	}
	return 0;
}
void solve()
{
	int i,ok;
	for(ok = 1; ok; )
	{
		ok = 0;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=N;++i)
			if(!dreapta[i]) ok |= pairUp(i);
	}
	int sol = 0;
	for(i=1;i<=N;++i) if(dreapta[i]) sol++;
	printf("%d\n",sol);
	for(i=1;i<=N;++i) if(dreapta[i]) printf("%d %d\n",i,dreapta[i]);
}
int main()
{
	read();
	solve();
	return 0;
}