Cod sursa(job #761711)

Utilizator lucian666Vasilut Lucian lucian666 Data 27 iunie 2012 10:30:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb



using namespace std;
#include<fstream>
#include<vector>
#include<cstring>

#define NN 10001
#define pb push_back

using namespace std;
ofstream out("cuplaj.out");

vector<int>G[NN];
typedef vector<int>::iterator IT;

int lf[NN],rt[NN],uz[NN],cuplaj,n,m,e;

void read();
int pairup(int);
void cupleaza();
void write();

int main()
{
	
	
	read();
	cupleaza();
	write();
	
	return 0;
	
}

void read()
{
	ifstream in("cuplaj.in");
	in>>n>>m>>e;
	for(int x,y;e;--e)
	{
		in>>x>>y;
		G[x].pb(y);
	}
}

void write()
{
	out<<cuplaj<<'\n';
	for(int i=1;i<=n;i++)
		if(rt[i])
			out<<i<<" "<<rt[i]<<" "<<'\n';
}

/*

int pairup(int start)
{
	
	if(uz[start])
		return 0;
	uz[start]=1;
	for(IT I=G[start].begin();I!=G[start].end();++I)
		if(!rt[*I] || pairup(rt[*I]))
		{
			lf[start]=*I;
			rt[*I]=start;
			return 1;
		}
		return 0;
}

*/
int pairup(int start)
{
	
	if(uz[start])
		return 0;
	uz[start]=1;
	for(IT I=G[start].begin();I!=G[start].end();++I)
		if(!lf[*I] || pairup(lf[*I]))
		{
			lf[*I]=start;
			rt[start]=*I;
			return 1;
		}
		return 0;
}
/*
void cupleaza()
{
	for(int i=1;i<=n;i++)
		if(!lf[i])
			{
			if(!pairup(i))
				{
				memset(uz,0,sizeof(uz));
				cuplaj+=pairup(i);
				}
			else
				cuplaj++;
			}
}

*/

void cupleaza()
{
	int ok=1;
	while(ok)
	{
		ok=0;
		memset(uz,0,sizeof(uz));
		for(int i=1;i<=n;i++)
				if(!rt[i]&&pairup(i))
				{
					++cuplaj;
					ok=1;
				}
	}
}