Cod sursa(job #2580094)

Utilizator MihclerioVladimir Chim Mihclerio Data 13 martie 2020 12:13:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

const int nmax=1e4+3;
const int inf=2e9+3;

using namespace std;

vector<int>v[nmax];

int l[nmax],r[nmax],f[nmax];

bool bi(int k)
{
  if(f[k]) return 0;
  f[k]=1;
  for(auto it:v[k])
  if(!r[it])
  {
    l[k]=it;
    r[it]=k;
    return 1;
  }
  for(auto it:v[k])
  if(bi(r[it]))
  {
    l[k]=it;
    r[it]=k;
    return 1;
  }
  return 0;
}

int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    int n,m,k;
    cin>>n>>m>>k;

    while(k--)
    {
      int x,y;
      cin>>x>>y;
      v[x].push_back(y);
    }

    int ok=1;
    while(ok)
    {
      ok=0;
      for(int i=0;i<nmax;i++) f[i]=0;
      for(int i=1;i<=n;i++)
      if(!l[i]) ok |= bi(i);
    }

    int cuplaj=0;
    for(int i=1;i<=n;i++) cuplaj+=(l[i]>0);
    cout<<cuplaj<<"\n";

    for(int i=1;i<=n;i++) if(l[i]>0)
    cout<<i<<" "<<l[i]<<"\n";

}