Cod sursa(job #1081154)

Utilizator federerUAIC-Padurariu-Cristian federer Data 13 ianuarie 2014 11:34:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream>
#include<vector>
#define Nmax 10010
using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector<int>G[Nmax];
int N, M, E, i, L[Nmax], R[Nmax], viz[Nmax];
int maxim;
void read()
{
	int x, y;
	fin>>N>>M>>E;
	for(i=1;i<=E;++i)
	{
		fin>>x>>y;
		G[x].push_back(y);
	}
}

bool pair_up(int nod)
{
	int i;
	if(viz[nod]) return 0;
	viz[nod]=1;
	for(i=0;i<G[nod].size();++i)
	{
		int vecin = G[nod][i];
		bool pair=pair_up(R[vecin]);
		if(!R[vecin] || pair)
		{
			R[vecin]=nod;
			L[nod]=vecin;
			return 1;
		}
	}
	return 0;
}

void solve()
{
	int gata=0, i;
	while(!gata)
	{
		gata=1;
		for(i=1;i<=N;++i)
			viz[i]=0;
		for(i=1;i<=N;++i)
			if(!L[i] && pair_up(i))
			{
				maxim++;
				gata=0;
			}
	}

}
void write()
{
	fout<<maxim<<'\n';
	for(i=1;i<=N;++i)
		if(L[i])
		fout<<i<<' '<<L[i]<<'\n';
}

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