Cod sursa(job #1007382)

Utilizator superman_01Avramescu Cristian superman_01 Data 8 octombrie 2013 20:59:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>


#define MAX_SIZE 10005

using namespace std;

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

vector < int > G[MAX_SIZE];
int N , M , E;
int l[MAX_SIZE], r[MAX_SIZE] , used[MAX_SIZE];

bool PairUp ( int node )
{
	if( used[node] ) return 0;
	used[node] = true ;
	for ( vector < int > ::iterator it = G[node].begin() ; it != G[node].end() ; ++it )
		if ( !l[*it] )
		{
			l[*it] = node ;
			r[node] = *it ;
			return 1 ;
		}
	for ( vector < int > ::iterator it = G[node].begin() ; it != G[node].end() ; ++it )
		if ( PairUp(l[*it]) )
		{
			l[*it] = node ;
			r[node] = *it ;
			return 1 ;
		}
	return 0;	
}

int main ( void )
{
	int i , j, x , y ;
	in >> N >> M >> E ;
	for ( i = 1 ; i <= E ; ++i )
	{
		in >> x >> y ;
		G[x].push_back(y);
	}
	bool ok = 1 ;
	for ( ; ok ; )
	{
		ok = 0 ;
		memset( used , 0 , sizeof(used) ) ;
	    for ( i = 1 ; i <= N ; ++i )
		   if ( !r[i] )
			ok |= PairUp(i);
	}	
	int cuplaj = 0 ;
	for ( i = 1 ; i  <= N ; ++i )
		if ( r[i] > 0 )
			++cuplaj;
	out << cuplaj << "\n";
	for ( i = 1 ; i <= N ; ++i )
		if ( r[i] > 0 )
			out << i << " "<<r[i] << "\n" ;
	in.close();
	out.close();
	return 0;
}