Cod sursa(job #3226593)

Utilizator superffffalexandru radu superffff Data 22 aprilie 2024 10:20:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <cstring>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int NMAX = 1e6 + 1;
vector<int> v[NMAX];
int l[NMAX], r[NMAX];
bool viz[NMAX];
int n,m,e;
bool cuplaj(int nod) {
  if (viz[nod])
    return false;

  viz[nod] = true;

  for (auto it : v[nod]) {
    if (!l[it]) {
      l[it] = nod;
      r[nod] = it;
      return true;
    }
  }

  for (auto it : v[nod]) {
    if (cuplaj(l[it])) {
      l[it] = nod;
      r[nod] = it;
      return true;
    }
  }

  return false;
}

int main() {
  int t;
  in>>n>>m>>e;
    for (int i = 1; i <= e ; ++i) {
      int x, y;
      in >> x >> y;
      y=y+n+1;
      v[x].push_back(y);
      v[y].push_back(x);
    }
    do {
     for(int i=1;i<=n;i++){
        viz[i]=0;
     }
      bool change = false;
      for (int i = 1; i <= n ; ++i) {
        if (!r[i])
          change |= cuplaj(i);
      }

      if (!change)
        break;
    } while (1);
 int sum=0;
   for(int i=1;i<=n;i++){
    if(r[i]!=0) {sum=sum+1;}
   }
   out<<sum<<'\n';
   for(int i=1;i<=n;i++){
    if(r[i]!=0) {out<<i<<" "<<r[i]-n-1<<'\n';}
   }
  return 0;
}