Cod sursa(job #611412)

Utilizator alexeiIacob Radu alexei Data 1 septembrie 2011 15:00:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>
#include<string.h>
#include<vector>

using namespace std;

#define NMAX 12000
vector< int > G[NMAX];

int L[NMAX],R[NMAX];
bool viz[NMAX];

int make_pair( int nod )
{
	if( viz[nod] )
		return 0; // am gasit 'recent' un corespondent pt nod
	
	viz[nod]=1;
	
	int i,v;
	for(i=0; (unsigned)i<G[nod].size(); ++i)
	{
		v=G[nod][i];
		if( !L[v] || make_pair( L[v] ) )
		{
			L[v]=nod;
			R[nod]=v;
			
			return 1; // am gasit o noua solutie
		}
	}
	
	return 0;	// nu am putut realiza un matching pentru $nod
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	
	int N1,N2,M;
	scanf("%d%d%d",&N1,&N2,&M);
	
	int a1,a2;
	while( M-- )
	{
		scanf("%d%d",&a1,&a2);
		G[a1].push_back(a2);		
	}

	while( 1 ) // cat timp poti sa iti imbunatatesti solutia 
	{
		memset( viz, 0, sizeof(viz) );
		
		int i,ok=0;
		for(i=1; i<=N1; ++i)
		{
			if( !R[i] ) // daca nodul i de pe flancul stang
				    // nu are corespondent pe flancul drept
				ok|=make_pair(i); // caut corespondent
		}

		if( !ok )
			break;
	}
				
	int i,ans=0;
	for(i=1; i<=N1; ++i)
		ans+=(R[i]!=0);

	printf("%d\n",ans);

	for(i=1; i<=N1; ++i)
	{
		if( R[i]!=0 )
			printf("%d %d\n",i,R[i]);	
	}
	
	return 0;
}