Cod sursa(job #2596782)

Utilizator victorzarzuZarzu Victor victorzarzu Data 10 aprilie 2020 13:37:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>

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

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

int verify(int nod)
{
  if(viz[nod]) return 0;
  viz[nod] = 1;
  for(auto vecin : graf[nod])
    if(!r[vecin])
    {
      r[vecin] = nod;
      l[nod] = vecin;
      return 1;
    }
  for(auto vecin : graf[nod])
    if(verify(r[vecin]))
    {
      r[vecin] = nod;
      l[nod] = vecin;
      return 1;
    }
   return 0;
}

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

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