Cod sursa(job #563647)

Utilizator ChallengeMurtaza Alexandru Challenge Data 25 martie 2011 17:08:23
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="cuplaj.in";
const char OutFile[]="cuplaj.out";
const int MaxN=10111;

ifstream fin(InFile);
ofstream fout(OutFile);

int L,R,E,x,y,l[MaxN],r[MaxN],used[MaxN];
vector<int> LA[MaxN];

inline bool cuplez(int nod)
{
	if(used[nod])
	{
		return false;
	}
	used[nod]=1;
	for(vector<int>::iterator it=LA[nod].begin();it!=LA[nod].end();++it)
	{
		if(!r[*it])
		{
			l[nod]=*it;
			r[*it]=nod;
			return true;
		}
	}
	for(vector<int>::iterator it=LA[nod].begin();it!=LA[nod].end();++it)
	{
		if(cuplez(r[*it]))
		{
			l[nod]=*it;
			r[*it]=nod;
			return true;
		}
	}
	return false;
}

inline int cuplaj()
{
	int cuplaj_maxim=0;
	bool am_cuplaj=true;
	while(am_cuplaj)
	{
		am_cuplaj=false;
		for(register int i=1;i<=L;++i)
		{
			if(!l[i])
			{
				memset(used,0,sizeof(used));
				if(cuplez(i))
				{
					++cuplaj_maxim;
					am_cuplaj=true;
				}
			}
		}
	}
	return cuplaj_maxim;
}

int main()
{
	fin>>L>>R>>E;
	for(register int i=1;i<=E;++i)
	{
		fin>>x>>y;
		LA[x].push_back(y);
	}
	fin.close();

	fout<<cuplaj()<<"\n";
	for(register int i=1;i<=L;++i)
	{
		if(l[i])
		{
			fout<<i<<" "<<l[i]<<"\n";
		}
	}
	fout.close();
	return 0;
}