Cod sursa(job #1139001)

Utilizator vladrochianVlad Rochian vladrochian Data 10 martie 2014 19:39:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
int n,m,e,l[10001],r[10001],nc;
vector<int> g[10001];
bool v[10001],ok=1;
bool link(int nod)
{
	size_t i;
	if(v[nod])
		return 0;
	v[nod]=1;
	for(i=0;i<g[nod].size();++i)
	{
		int vecin=g[nod][i];
    if(!r[vecin])
		{
			l[nod]=vecin;
			r[vecin]=nod;
			return 1;
		}
	}
	for(i=0;i<g[nod].size();++i)
	{
		int vecin=g[nod][i];
		if(link(r[vecin]))
		{
			l[nod]=vecin;
			r[vecin]=nod;
			return 1;
		}
	}
	return 0;
}
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int main()
{
	int i,x,y;
	fin>>n>>m>>e;
	while(e--)
	{
		fin>>x>>y;
		g[x].push_back(y);
	}
	while(ok)
	{
		ok=0;
		memset(v,0,sizeof v);
		for(i=1;i<=n;++i)
			if(!l[i])
				ok|=link(i);
	}
	for(i=1;i<=n;++i)
		if(l[i])
			++nc;
	fout<<nc<<"\n";
	for(i=1;i<=n;++i)
		if(l[i])
			fout<<i<<" "<<l[i]<<"\n";
	return 0;
}