Pagini recente » Cod sursa (job #2099090) | Cod sursa (job #462664) | Cod sursa (job #956490) | Cod sursa (job #1617113) | Cod sursa (job #1346403)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#define NMAX 100005
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in ( "cuplaj.in" );
ofstream out ( "cuplaj.out" );
vector < int > G[NMAX] ;
int N , M , E ;
int l[NMAX] , r[NMAX] ;
bool ok , used[NMAX] ;
bool MakePair ( 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] ){
r[node] = *it ;
l[ *it ] = node ;
return 1;
}
for( vector < int > ::iterator it = G[node].begin() ; it != G[node].end() ; ++it )
if ( MakePair ( l[*it])){
r[node] = *it;
l[*it] = node ;
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);
}
while( ok ){
memset ( used , 0 , sizeof(used));
ok = false;
for ( i = 1 ; i <= N ; ++i )
if ( !r[i] )
ok |= MakePair( i );
}
int Answer = 0 ;
for ( i = 1 ; i <= N ; ++i )
Answer += (r[i] == 1 );
out << Answer << "\n";
for ( i = 1 ; i <= N ; ++i )
if ( r[i] )
out << i << " " << right[i] << "\n";
return 0 ;
}