Cod sursa(job #2719421)

Utilizator victorzarzuZarzu Victor victorzarzu Data 9 martie 2021 20:36:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#define zeros(x) ((x ^ (x - 1)) & x)

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e, l[10005], r[10005], x, y;
bool viz[10005], change;
vector<int> graf[10005];

void Read()
{
  f>>n>>m>>e;
  for(int i = 1;i <= e;++i)
    f>>x>>y, graf[x].push_back(y);
}

bool verify(int nod)
{
  if(viz[nod]) return false;
  viz[nod] = true;
  for(auto it : graf[nod])
    if(!r[it])
    {
      r[it] = nod;
      l[nod] = it;
      return true;
    }
  for(auto it : graf[nod])
    if(verify(r[it]))
      {
        r[it] = nod;
        l[nod] = it;
        return true;
      }
  return false;
}

void Solve()
{
  change = true;
  while(change)
  {
    change = false;
    memset(viz, 0, sizeof(viz));
    for(int i = 1;i <= n;++i)
      if(!l[i])
        change |= verify(i);
  }
  int nr = 0;
  for(int i = 1;i <= n;++i)
    if(l[i]) ++nr;
  g<<nr<<'\n';
  for(int i = 1;i <= n;++i)
    if(l[i])
      g<<i<<" "<<l[i]<<'\n';
}

int main()
{
  Read();
  Solve();
  return 0;
}