Cod sursa(job #761708)

Utilizator lucian666Vasilut Lucian lucian666 Data 27 iunie 2012 10:22:29
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb



using namespace std;
#include<fstream>
#include<vector>
#include<cstring>

#define NN 10001
#define pb push_back

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

vector<int>G[NN];
typedef vector<int>::iterator IT;

int lf[NN],rt[NN],uz[NN],cuplaj,n,m,e;

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

int main()
{
	
	
	read();
	cupleaza();
	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);
	}
}

void write()
{
	out<<cuplaj<<'\n';
	for(int i=1;i<=n;i++)
		if(lf[i])
			out<<i<<" "<<lf[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(!rt[*I] || pairup(rt[*I]))
		{
			lf[start]=*I;
			rt[*I]=start;
			return 1;
		}
		return 0;
}

void cupleaza()
{
	for(int i=1;i<=n;i++)
		if(!lf[i])
			{
			if(!pairup(i))
				{
				memset(uz,0,sizeof(uz));
				cuplaj+=pairup(i);
				}
			else
				cuplaj++;
			}
}