Cod sursa(job #568048)

Utilizator cdascaluDascalu Cristian cdascalu Data 30 martie 2011 19:35:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>
#include<bitset>
#include<vector>
#define MAX 10001
using namespace std;
int l[MAX],r[MAX],N,M,E;
bitset<MAX> u;
vector<int> G[MAX];
void read()
{
	ifstream f("cuplaj.in");
	f>>N>>M>>E;
	int i,x,y;
	for(i=1;i<=E;++i)
	{
		f>>x>>y;
		G[x].push_back(y);
	}
	f.close();
}
int pairup(int x)
{
	if(u[x])return 0;
	u[x] = 1;
	for(vector<int>::iterator it = G[x].begin();it!=G[x].end();++it)
		if(!r[*it])
		{
			l[x] = *it;
			r[*it] = x;
			return 1;
		}
	for(vector<int>::iterator it = G[x].begin();it!=G[x].end();++it)
		if(pairup(r[*it]))
		{
			l[x] = *it;
			r[*it] = x;
			return 1;
		}
	return 0;
}
int main()
{
	read();
	int change = 1,i;
	while(change)
	{
		change = 0;
		u.reset();
		for(i=1;i<=N;++i)
			if(!l[i])
				if(pairup(i))change = 1;
	}
	int cnt = 0;
	for(i=1;i<=N;++i)
		if(l[i])++cnt;
	ofstream g("cuplaj.out");
	g<<cnt<<"\n";
	for(i=1;i<=N;++i)
		if(l[i])g<<i<<" "<<l[i]<<"\n";
	g.close();
	return 0;
}