Cod sursa(job #867295)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 29 ianuarie 2013 15:24:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb

#include <cstdio>
#include <fstream>
#include <vector>

using namespace std;

const int N=10001;

vector<int> G[N],L,R;
vector<bool> U;
int n,m,SOL;

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

bool CUPLEAZA (int nod)
{
	if( U[nod] )
		return 0;
	U[nod]=1;
	for(vector<int>::iterator it=G[nod].begin();it<G[nod].end();++it)
		if( !R[*it] || CUPLEAZA(R[*it]) )
		{
			R[*it]=nod;
			L[nod]=*it;
			return 1;
		}
	return 0;
}

void SOLVE ()
{
	L.resize(n+1);
	R.resize(n+1);
	for(bool ok=1;ok;)
	{
		U.assign(n+1,0);
		ok=0;
		for(int i=1;i<=n;++i)
			if( !L[i] && CUPLEAZA(i) )
			{
				ok=1;
				++SOL;
			}
	}
}

void OUT ()
{
	freopen ("cuplaj.out","w",stdout);
	printf("%d\n",SOL);
	for(int i=1;i<=n;++i)
		if(L[i])
			printf("%d %d\n",i,L[i]);
}

int main ()
{
	READ ();
	SOLVE ();
	OUT ();
	return 0;
}