Cod sursa(job #2482399)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 28 octombrie 2019 10:58:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");



int N, M, E, u, v;
int L[10003], R[10003];

vector<int> G[10003];
bool sel[10003];

bool cuplaj(int nod) {
   sel[nod] = true;

   for(auto i : G[nod])
      if(!R[i]) {
         L[nod] = i;
         R[i] = nod;
         return true;
      }

   for(auto i : G[nod])
      if(!sel[R[i]] && cuplaj(R[i])) {
         L[nod] = i;
         R[i] = nod;
         return true;
      }

   return 0;
}

int cuplaj() {
   bool can = true;
   while(can) {
      can = false;

      memset(sel, false, sizeof(sel));
      for(int i = 1; i <= N; i++)
         if(!L[i] && !sel[i])
            can |= cuplaj(i);
   }
   int nr = 0;


   for(int i = 1; i <= N; i++)
      nr += (L[i] != 0);

   return nr;
}
int main() {
   f >> N >> M >> E;
   for(int i = 1; i <= E; i++) {
      f >> u >> v;
      G[u].push_back(v);
   }
   g << cuplaj() << "\n";
   for(int i = 1; i <= N; i++)
      if(L[i]) {
         g << i << " " << L[i] << "\n";
      }
   return 0;
}