Cod sursa(job #582188)

Utilizator petroMilut Petronela petro Data 14 aprilie 2011 23:47:25
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<vector>
#include<stdio.h>
#define M 10003
using namespace std;

FILE *F=fopen("cuplaj.in","r");
FILE *G=fopen("cuplaj.out","w");

vector<int> a[M];
vector<int>::iterator it;

int l[M], r[M],n;
bool viz[M];

void cit()
{
	int i,e,x,y,m;
	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);
	}
	fclose(F);
}

void afis()
{
	int i;
	for(i=1;i<=n;++i)
		if(l[i]) 
			fprintf(G,"%d %d\n",i,l[i]);
	fclose(G);
}

int pereche(int x)
{
	if(viz[x]) return 0;
	viz[x]=1;
	
	for(it=a[x].begin();it!=a[x].end();++it)
		if(r[*it]==0 || pereche(r[*it]))
		{
			l[x]=*it;
			r[*it]=x;
			return 1;
		}
	
	return 0;
}

void cuplaj()
{
	int ok=1, i;
	long c=0;

	while(ok)
	{
		ok=0;
		memset(viz, 0, sizeof(bool)*(n+1));
		for(i=1;i<=n;++i)
			if(l[i]==0)
				if(pereche(i))
				{
					++c;
					ok=1;
				}
	}
	fprintf(G,"%ld\n",c);
}

int main()
{
	cit();
	cuplaj();
	afis();
	return 0;
}