Cod sursa(job #1346403)

Utilizator superman_01Avramescu Cristian superman_01 Data 18 februarie 2015 11:16:28
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#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 ;
}