Cod sursa(job #584895)

Utilizator crushackPopescu Silviu crushack Data 26 aprilie 2011 22:33:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMax 10010
using namespace std;

const char IN[]="cuplaj.in",OUT[]="cuplaj.out";

int N,M,K,Rez;
int L[NMax],R[NMax];
bool visit[NMax];
vector<int> ad[NMax];

bool pairup(int x)
{
	if (x<0 || visit[x]) return false;
	visit[x]=true;
	
	for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it) if (R[*it]<0)
	{
		L[x]=*it;
		R[*it]=x;
		return true;
	}
	for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it) if (pairup(R[*it]))
	{
		L[x]=*it;
		R[*it]=x;
		return true;
	}
	return false;
}

int main()
{
	int i,x,y,c;
	freopen(IN,"r",stdin);
	scanf("%d%d%d",&N,&M,&K);
	for (i=0;i<K;++i)
		scanf("%d%d",&x,&y),
		ad[x-1].push_back(y-1);
	fclose(stdin);
	for (i=0;i<N;++i) L[i]=-1;
	for (i=0;i<M;++i) R[i]=-1;
	for (c=1;c;)
	{
		c=0;
		memset(visit,0,sizeof(visit));
		for (i=0;i<N;++i) if (L[i]<0)
			c |= pairup(i);
	}
	for (i=0;i<N;++i) Rez+=(L[i]>=0);
	freopen(OUT,"w",stdout);
	printf("%d\n",Rez);
	for (i=0;i<N;++i) if (L[i]>=0)
		printf("%d %d\n",i+1,L[i]+1);
	fclose(stdout);
	return 0;
}