Cod sursa(job #2528649)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 22 ianuarie 2020 12:02:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>

const int MAXN = 10000;

using namespace std;

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

vector<int> g[MAXN+1];

int n, m, e;
int l[MAXN+1], r[MAXN+1];
bool viz[MAXN+1];

void reset( bool v[] )
{
  for( int i=1;i<=n;i++ )
    v[i]=false;
}

bool pairup( int node )
{
  if( viz[node] )
    return false;

  viz[node]=true;

  for( vector<int>::iterator it=g[node].begin();it!=g[node].end();it++ )
    if( !r[*it] )
    {
      l[node]=*it;
      r[*it]=node;

      return true;
    }

  for( vector<int>::iterator it=g[node].begin();it!=g[node].end();it++ )
    if( pairup(r[*it]) )
    {
      l[node]=*it;
      r[*it]=node;

      return true;
    }

  return false;
}

int main()
{
  cin>>n>>m>>e;

  for( int i=1;i<=e;i++ )
  {
    int x, y;

    cin>>x>>y;

    g[x].push_back(y);
  }

  bool ok;

  do
  {
    ok=false;

    reset(viz);

    for( int i=1;i<=n;i++ )
      if( !l[i] )
        ok|=pairup(i);
  }
  while( ok );

  int ans=0;

  for( int i=1;i<=n;i++ )
    if( l[i]!=0 )
      ans++;

  cout<<ans<<"\n";

  for( int i=1;i<=n;i++ )
    if( l[i]!=0 )
      cout<<i<<" "<<l[i]<<"\n";

  return 0;
}