Cod sursa(job #720075)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 22 martie 2012 12:35:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <cstring>
#include <vector>
#define MAXN 10010
using namespace std;
vector<int>v[MAXN];
int r[MAXN],l[MAXN],n,m,e,c;
bool u[MAXN];
bool pairup(int x)
{
	vector<int>::iterator  it;
	if(u[x]) return 0;
	u[x]=1;
	for(it=v[x].begin();it!=v[x].end();it++)
	if(r[*it]==0)
	{
		l[x]=*it;
		r[*it]=x;
		c++;
		return 1;
	}
	for(it=v[x].begin();it!=v[x].end();it++)
	if(pairup(r[*it]))
	{
		l[x]=*it;
		r[*it]=x;
		return 1;
	}
	return 0;
}
int main()
{
	int i,x,y;
	bool ok;
	ifstream fi("cuplaj.in");
	ofstream fo("cuplaj.out");
	fi>>n>>m>>e;
	for(i=1;i<=e;i++)
	{
		fi>>x>>y;
		v[x].push_back(y);
	}
	ok=1;
	while(ok)
	{
		ok=0;
		memset(u,0,sizeof(u));
		for(i=1;i<=n;i++) if(!l[i]) if(pairup(i)) ok=1; 
	}
	fo<<c<<"\n";
	for(i=1;i<=n;i++)
	if(l[i]) fo<<i<<" "<<l[i]<<"\n";
	return 0;
}