Cod sursa(job #3293247)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 10 aprilie 2025 23:22:45
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <vector>

constexpr int NIL = -1;

const int MAXN = 2 * 10000;
std::vector<int> adj[MAXN];
int pair[MAXN];
bool viz[MAXN];

bool try_pair( int u ) {
  viz[u] = true;

  for( int v : adj[u] )
    if( pair[v] == NIL ){
      pair[v] = u;
      pair[u] = v;
      return true;
    }

  for( int v : adj[u] ){
    if( viz[v] )
      continue;
    
    viz[v] = true;
    if( try_pair( pair[v] ) ){
      pair[v] = u;
      pair[u] = v;
      return true;
    }
  }

  return false;
}

int main() {
  FILE *fin = fopen( "cuplaj.in", "r" );
  FILE *fout = fopen( "cuplaj.out", "w" );

  int left, right, m;
  fscanf( fin, "%d%d%d", &left, &right, &m );
  int n = left + right;

  for( int i = 0; i < n; i++ )
    pair[i] = NIL;
  for( int i = 0; i < m; i++ ){
    int a, b;
    fscanf( fin, "%d%d", &a, &b );
    a--; b--;

    b += left;
    adj[a].push_back( b );
    adj[b].push_back( a );
  }

  { // baga cuplaj tati
    bool same = false;
    while( !same ){
      same = true;
      for( int i = 0; i < n; i++ )
        viz[i] = false;

      for( int i = 0; i < left; i++ )
        if( !viz[i] && pair[i] == NIL )
          same |= try_pair( i );
    }
  }

  std::vector<std::pair<int, int>> edges;
  for( int i = 0; i < left; i++ )
    if( pair[i] != NIL )
      edges.emplace_back( i + 1, pair[i] - left + 1 );

  fprintf( fout, "%d\n", (int)edges.size() );
  for( auto [a, b]: edges )
    fprintf( fout, "%d %d\n", a, b );

  fclose( fin );
  fclose( fout );
  return 0;
}