Cod sursa(job #589901)

Utilizator tudorsTudor Siminic tudors Data 14 mai 2011 12:02:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <vector>
#define MA 10005
using namespace std;
int N,M,E;
int rez,L[MA],R[MA],VIZ[MA];
vector <int> A[MA];
FILE *f,*g;
void read()
{
	int i,x,y;
	fscanf(f,"%d %d %d",&N,&M,&E);
	for (i=1;i<=E;++i)
	{
		fscanf(f,"%d %d",&x,&y);
		A[x].push_back(y);
	}
}
bool cuplez(int nod)
{
	int z;
	if (VIZ[nod]==1)
		return 0;
	VIZ[nod]=1;
	for (vector <int> :: iterator it=A[nod].begin();it!=A[nod].end();it++)
		if (R[*it]==0)
		{
			L[nod]=*it;
			R[*it]=nod;
			return 1;
		}
	for (vector <int> :: iterator it=A[nod].begin();it!=A[nod].end();it++)
	{
		z=*it;
		if (cuplez(R[z]))
		{
			L[nod]=z;
			R[z]=nod;
			return 1;
		}
	}
	return 0;
}
void solve()
{
	int i,ok;
	rez=0;
	ok=1;
	while (ok)
	{
		ok=0;
		memset(VIZ,0,sizeof(VIZ));
		for (i=1;i<=N;++i)
			if (L[i]==0)
			{
				if (cuplez(i))
				{
					rez++;
					ok=1;
				}
			}
	}
}
void print()
{
	int i;
	fprintf(g,"%d\n",rez);
	for (i=1;i<=N;++i)
		if (L[i]!=0)
			fprintf(g,"%d %d\n",i,L[i]);
}
int main()
{
	f=fopen("cuplaj.in","r");
	g=fopen("cuplaj.out","w");
	read();
	solve();
	print();
	fclose(f);
	fclose(g);
	return 0;
}