Cod sursa(job #2931018)

Utilizator victorzarzuZarzu Victor victorzarzu Data 30 octombrie 2022 11:17:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

#define N 100005

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

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

bool cupl(int node) {
  if(viz[node]) {
    return false;
  }
  viz[node] = node;

  for(const auto& vecin : graf[node]) {
    if(!r[vecin]) {
      r[vecin] = node;
      l[node] = vecin;
      return true;
    }
  } 

  for(const auto& vecin : graf[node]) {
    if(cupl(r[vecin])) {
      r[vecin] = node;
      l[node] = vecin;
      return true;
    }
  } 

  return false;
}

void solve() {
  bool change = true;
  while(change) {
    change = false;
    memset(viz, false, sizeof(viz));

    for(int i = 1;i <= n;++i) {
      if(!l[i]) {
        change |= cupl(i);
      }
    }
  }

  int count = 0;
  for(int i = 1;i <= n;++i) {
    if(l[i]) {
      count++;
    }
  }
  g<<count<<'\n';
  for(int i = 1;i <= n;++i) {
    if(l[i]) {
      g<<i<<" "<<l[i]<<'\n';
    }
  }
  g.close();
}

int main() {
  read();
  solve();
  return 0;
}