Cod sursa(job #2985864)

Utilizator dumisDumitru Sebastian dumis Data 27 februarie 2023 12:02:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 10002;

vector<int> G[DIM];
vector<pair<int, int>> res;
int L[DIM], R[DIM];
bool viz[DIM];

bool pair_up( int u ) {
  if ( viz[u] ) return false;
  viz[u] = true;
  for ( auto v : G[u] ) {
    if ( !R[v] ) {
      L[u] = v;
      R[v] = u;
      return true;
    }
  }
  for ( auto v : G[u] ) {
    if ( pair_up(R[v]) ) {
      L[u] = v;
      R[v] = u;
      return true;
    }
  }
  return false;
}

int main() {
  int n, m, e, u, v;

  fin >> n >> m >> e;
  while ( e-- ) {
    fin >> u >> v;
    G[u].push_back(v);
  }
  bool ok = true;
  while ( ok ) {
    ok = false;
    for ( int i = 1; i <= n; ++i ) {
      viz[i] = false;
    }
    for ( int i = 1; i <= n; ++i ) {
      if ( !L[i] ) {
        if ( pair_up(i) ) ok = true;
      }
    }
  }
  for ( int i = 1; i <= n; ++i ) {
    if ( L[i] ) {
      res.push_back({i, L[i]});
    }
  }
  fout << res.size() << "\n";
  for ( auto &[x, y] : res ) {
    fout << x << " " << y << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}