Cod sursa(job #729966)

Utilizator paulbotabota paul paulbota Data 31 martie 2012 18:46:59
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<fstream>
#include<vector>
#define maxn 10010
#define pb push_back

using namespace std;

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

vector<int> graf[maxn];
int N,M,E,layer[maxn],rasp,conect[maxn];
int viz[maxn];


int cuplaj(int nod)
{
	if(viz[nod]==1)
		return 0;
	viz[nod]=1;
	int k;
	for(k=0;k<graf[nod].size();k++)
		if(!conect[graf[nod][k]])
		{
			layer[nod]=graf[nod][k];
			conect[graf[nod][k]]=nod;
			return 1;
		}
	for(k=0;k<graf[nod].size();k++)
		if(cuplaj(graf[nod][k]))
		{
			layer[nod]=graf[nod][k];
			conect[graf[nod][k]]=nod;
			return 1;
		}
	return 0;
}

int main()
{
	in>>N>>M>>E;
	int i,j;
	for(;E;E--)
	{
		in>>i>>j;
		graf[i].pb(j);
	}
	bool pos=true;
	while(pos)
	{
		pos=false;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=N;i++)
			if(layer[i]==0 && cuplaj(i))
			{
				pos=true;
				rasp++;
			}
	}
	out<<rasp<<"\n";
	for(i=1;i<=N;i++)
		if(layer[i]!=0)
		out<<i<<" "<<layer[i]<<"\n";
	return 0;
}