Cod sursa(job #2387043)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 24 martie 2019 11:35:40
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#define maxn 20000
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define inf INT_MAX/2-1

using namespace std;

vector <int> g[maxn+5];
map <pii,char> _cap;
map <pii,char> _flx;
vector <int> way;
vector <pii> cup;
bool viz[maxn+5];
int flux;
int l, r;

void _reset ( int n ) { for ( int i = 0; i < n; i++ ) viz[i] = 0; }

void dfs ( int nod )
{
  viz[nod] = 1; way.pb (nod);
  if ( nod == l + r + 1 ) { flux = 1; return; }
  int i, sz = g[nod].size(), nn;
  for ( i = 0; i < sz && flux == 0; i++ )
  {
    nn = g[nod][i];
    if ( viz[nn] == 0 && _cap[{nod,nn}] > _flx[{nod,nn}] ) dfs (nn);
  }
  if (flux == 0) way.pop_back ();
}

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

  int e; fin >> l >> r >> e;

  int i, j, a, b, sz;
  for ( i = 0; i < e; i++ )
  {
    fin >> a >> b;
    g[a].pb (l+b); g[l+b].pb (a);
    _cap[{a,l+b}] = 1;
  }

  for ( i = 1; i <= l; i++ ) g[i].pb (0), g[0].pb (i), _cap[{0,i}] = 1;
  for ( i = l + 1; i <= l+r; i++ ) g[i].pb (l+r+1), g[l+r+1].pb (i), _cap[{i,l+r+1}] = 1;

  dfs (0);
  while (flux == 1)
  {
    sz = way.size();
    for ( i = 0; i < sz-1; i++ ) _flx[{way[i],way[i+1]}]++, _flx[{way[i+1],way[i]}]--;
    _reset (l+r+2); way.clear();
    flux = 0; dfs (0);
  }

  for ( i = 1; i <= l; i++ )
    for ( j = 0; j < g[i].size(); j++ )
      if ( g[i][j] > 0 && _flx[{i,g[i][j]}] == 1 )
        cup.pb ( {i,g[i][j]-l} );

  sz = cup.size();
  fout << sz << '\n';
  for ( i = 0; i < sz; i++ ) fout << cup[i].fi << ' ' << cup[i].se << '\n';

  fin.close ();
  fout.close ();

  return 0;
}