Cod sursa(job #2383513)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 19 martie 2019 16:53:09
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <deque>
#include <vector>

using namespace std;

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

const int NMAX = 20005;
const int INF = 2000000000;

int N, M, nr_e;

vector <int> Ad[NMAX];

int match[NMAX], dist[NMAX];

void Read()
{
  fin >> N >> M >> nr_e;

  int x, y;

  for( int i = 1; i <= nr_e; ++i )
  {
    fin >> x >> y;

    Ad[x].push_back( N + y );
    Ad[N + y].push_back( x );
  }

  fin.close();
}

bool Bfs()
{
  deque <int> Q;

  dist[0] = INF;

  for( int i = 1; i <= N; ++i )
    if( match[i] == 0 )
    {
      Q.push_back( i );
      dist[i] = 0;
    }
    else dist[i] = INF;

  int u, w;

  while( !Q.empty() )
  {
    u = Q.front();
    Q.pop_front();

    if( u == 0 ) continue;

    for( int i = 0; i < Ad[u].size(); ++i )
    {
      w = Ad[u][i];

      if( dist[ match[w] ] == INF )
      {
        dist[ match[w] ] = dist[u] + 1;
        Q.push_back( match[w] );
      }
    }
  }

  return ( dist[0] < INF );
}

bool Dfs( int nod )
{
  if( nod == 0 ) return true;

  int w;

  for( int i = 0; i < Ad[nod].size(); ++i )
  {
    w = Ad[nod][i];

    if( dist[ match[w] ] == dist[nod] + 1 && Dfs( match[w] ) )
    {
      match[nod] = w;
      match[w] = nod;

      return true;
    }
  }

  dist[nod] = INF;

  return false;
}

void Do()
{
  int cuplaj = 0;

  while( Bfs() )
   for( int i = 1; i <= N; ++i )
     if( match[i] == 0 && Dfs( i ) )
       ++cuplaj;

  fout << cuplaj << '\n';

  for( int i = 1; i <= N; ++i )
    if( match[i] != 0 )
     fout << i << ' ' << match[i] - N << '\n';
}

int main()
{
    Read();
    Do();

    return 0;
}