Cod sursa(job #762212)

Utilizator lucian666Vasilut Lucian lucian666 Data 29 iunie 2012 12:57:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb


#include<fstream>
#include<cstring>
#include<vector>

#define pb push_back
#define NN 10001

using namespace std;
ofstream out("cuplaj.out");

int st[NN],dr[NN],n,m,e,cuplaj,uz[NN];
vector<int>G[NN];
typedef vector<int>:: iterator IT;

void read();
int pairup(int);
void facuplaj();
void write();

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

void read()
{
	ifstream in("cuplaj.in");
	in>>n>>m>>e;
	for(int x,y;e;--e)
	{
		in>>x>>y;
		G[x].pb(y);
		//G[y].pb(x);
	}
	
}


void write()
{
	out<<cuplaj<<'\n';
	for(int i=1;i<=n;i++)
		if(dr[i])
			out<<i<<" "<<dr[i]<<" "<<'\n';
}


int pairup(int start)
{
	if(uz[start])
		return 0;
	uz[start]=1;
		for(IT I=G[start].begin();I!=G[start].end();++I)
			if(!st[*I] || pairup(st[*I]) )
			{
				st[*I]=start;
				dr[start]=*I;
				return 1;
			}
			return 0;
}

void facuplaj()
{
	int ok=1;
	while(ok)
	{
		ok=0;
		memset(uz,0,sizeof(uz));
		for(int i=1;i<=n;i++)
			if(!dr[i] && pairup(i))
			{
				++cuplaj;
				ok=1;
			}
	}
}