Cod sursa(job #429390)

Utilizator DranaXumAlexandru Dumitru Paunoiu DranaXum Data 30 martie 2010 08:45:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<iostream>
#include<vector>
#include<cstring>

#define NMAX 10001

using namespace std;

vector<int> G[NMAX];
int deg[NMAX],l[NMAX],r[NMAX];
int n,m;

int  pairup(int x)
{
	if(deg[x]) return 0;
	deg[x]=1;
	for(vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
		if(!r[*it]){l[x]=*it; r[*it]=x; return 1;}
	for(vector<int>::iterator it=G[x].begin();it!=G[x].end();it++)
		if(pairup(r[*it])){l[x]=*it; r[*it]=x; return 1;}	
	return 0;
}

void citire()
{
	int e,x,y;
	cin>>n>>m>>e;
	for(int i=1;i<=e;i++)
	{
		cin>>x>>y;
		G[x].push_back(y);
	}
}

void rezolvare()
{
	int ok=1;
	while(ok)
	{
		ok=0;
		memset(deg,0,sizeof(deg));
		for(int i=1;i<=n;i++)
		{
			if(!l[i])
				ok|=pairup(i);
		}
	}
}

void afisare()
{
	int i,cp;
	cp=0;
	for(i=1;i<=n;i++)
		if(l[i]>0)
			cp++;
	cout<<cp<<"\n";
	for(i=1;i<=n;i++)
		if(l[i]>0)
			cout<<i<<" "<<l[i]<<"\n";
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	citire();
	rezolvare();
	afisare();
	return 0;
}