Cod sursa(job #3243616)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 19 septembrie 2024 19:14:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
bool ok = false, viz[10005];
int n, m, k, a, b, ct, st[10005], dr[10005];
vector<int>noduri[10005];
bool cuplaj(int nod)
{
    if(viz[nod])
    {
        return 0;
    }
    viz[nod] = 1;
    for(auto it: noduri[nod])
    {
        if(dr[it] == 0)
        {
            st[nod] = it;
            dr[it] = nod;
            return 1;
        }
    }
    for(auto it : noduri[nod])
    {
        if(cuplaj(dr[it]))
        {
          st[nod] = it;
          dr[it] = nod;
          return 1;
        }
    }
    return 0;
}
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int32_t main(int argc, char * argv[])
{
      fin >> n >> m >> k;
      for(int i = 1; i <= k; ++i)
      {
          fin >> a >> b;
          noduri[a].push_back(b);
      }
      do
      {
          ok = 0;
          memset(viz, 0, sizeof viz);
          for(int i = 1; i <= n; ++i)
          {
              if(!st[i])
                  ok |= cuplaj(i);
          }

      }while(ok);
      for(int i = 1; i <= n; ++i)
      {
          if(st[i])
          {
              ct++;
          }
      }
      fout << ct << '\n';
      for(int i = 1; i <= n; ++i)
      {
          if(st[i])
          {
              fout << i << " " << st[i] << '\n';
          }
      }
      return 0;
}