Cod sursa(job #720724)

Utilizator Robert29FMI Tilica Robert Robert29 Data 22 martie 2012 20:49:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
#include<cstring>
#include<vector>
#define nm 10002
using namespace std;
FILE*f=fopen("cuplaj.in","r");
FILE*g=fopen("cuplaj.out","w");
int x,n,m,e,y,ok,s[nm],d[nm];
vector <int> v[nm];
char viz[nm];
int cuplaj(int x)
{
	if (viz[x])
		return 0;
	viz[x]=1;
	for(int i=0;i<v[x].size();++i)
		if(!d[v[x][i]])
		{
			s[x]=v[x][i];
			d[v[x][i]]=x;
			return 1;
		}
	for(int i=0;i<v[x].size();++i)
		if(cuplaj(d[v[x][i]]))
		{
			s[x]=v[x][i];
			d[v[x][i]]=x;
			return 1;
		}
	return 0;
}
int main()
{
	fscanf(f,"%d%d%d",&n,&m,&e);
	for(int i=1;i<=e;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		v[x].push_back (y);
	}
	
	do
	{
		ok=0;
		memset(viz,0,sizeof(viz));
		for(int i=1;i<=n;++i)
			if(!s[i])
			{
				x=cuplaj(i);
				if(x)
					ok=1;
			}
	}
	while(ok);
	int sol=0;
	for(int i=1;i<=n;++i)
		if(s[i])
			++sol;
	fprintf(g,"%d\n",sol);
	for(int i=1;i<=n;++i)
		if(s[i])
			fprintf(g,"%d %d\n",i,s[i]);
	fclose(f);
	fclose(g);
	return 0;
}