Cod sursa(job #482282)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 2 septembrie 2010 22:42:40
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<algorithm>
#include<vector>
using namespace std;
#define N_MAX 10002

int ut[N_MAX];
int st[N_MAX],dr[N_MAX];
int n,m,e,x,y,i,j;

vector <int> a[N_MAX];
vector <pair <int,int> > sol;

int pairUp(int nod)
{
	if(ut[nod])
		return 0;
	ut[nod]=1;
	vector <int> ::iterator it;
	for(it=a[nod].begin();it!=a[nod].end();it++)
	{
		if(st[*it]==0)
		{
			st[*it]=nod;
			dr[nod]=*it;
			return 1;
		}
		if(pairUp(st[*it]))
		{
			st[*it]=nod;
			dr[nod]=*it;
			return 1;
		}
	}
	return 0;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);

	scanf("%d%d%d",&n,&m,&e);
	for(i=1;i<=e;i++)
	{
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
	}
	
	while(1)
	{
		memset(ut+1,0,sizeof(int)*n);
		int ok=0;
		for(i=1;i<=n;i++)
			if(dr[i]==0)
				if(pairUp(i))
					ok=1;
		if(!ok)
			break;
	}

	for(i=1;i<=n;i++)
		if(dr[i])
			sol.push_back(make_pair(i,dr[i]));

	printf("%d\n",(int)sol.size());
	for(i=0;i<(int)sol.size();i++)
		printf("%d %d\n",sol[i].first,sol[i].second);

	return 0;
}