Cod sursa(job #603594)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 17 iulie 2011 16:25:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
#include<vector>
using namespace std;
vector<int> V[20010];
int n,m,e,a,b,ok,viz[20010],cuplat[20010],sol,DFS(int),i;
void read(),solve();
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",&a,&b);
		b+=10000;
		V[a].push_back(b);
		V[b].push_back(a);
	}
}
void solve()
{
	while(!ok)
	{
		ok=1;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=n;i++)
			if(!cuplat[i])
				if(DFS(i)){ok=0;++sol;}
	}
	printf("%d\n",sol);
	for(i=1;i<=n;i++)if(cuplat[i])printf("%d %d\n",i,cuplat[i]-10000);
}
int DFS(int X)
{
	if(viz[X])return 0;
	viz[X]=1;
	for(vector<int>::iterator it=V[X].begin();it!=V[X].end();it++)
		if(!cuplat[*it])
		{
			cuplat[X]=*it;
			cuplat[*it]=X;
			return 1;
		}
	for(vector<int>::iterator it=V[X].begin();it!=V[X].end();it++)
		if(DFS(cuplat[*it]))
		{
			cuplat[X]=*it;
			cuplat[*it]=X;
			return 1;
		}
	return 0;
}