Cod sursa(job #2017881)

Utilizator TincaMateiTinca Matei TincaMatei Data 2 septembrie 2017 21:00:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 10000;
vector<int> graph[1+MAX_N];
int last[1+MAX_N], l[1+MAX_N], r[1+MAX_N];
int op;

bool pairup(int nod) {
  if(last[nod] == op)
    return false;
  last[nod] = op;
  for(auto it: graph[nod])
    if(l[it] == 0) {
      l[it] = nod;
      r[nod] = it;
      return true;
    }
  for(auto it: graph[nod])
    if(l[it] != 0 && pairup(l[it])) {
      l[it] = nod;
      r[nod] = it;
      return true;
    }
  return false;
}

int main() {
  int n, m, e, a, b, cuplaj = 0;
  FILE *fin = fopen("cuplaj.in", "r");
  fscanf(fin, "%d%d%d", &n, &m, &e);
  for(int i = 0; i < e; ++i) {
    fscanf(fin, "%d%d", &a, &b);
    graph[a].push_back(b);
  }
  fclose(fin);

  bool cuplate;
  do {
    ++op;
    cuplate = false;
    for(int i = 1; i <= n; ++i)
      if(r[i] == 0 && pairup(i)) {
        cuplaj++;
        cuplate = true;
      }
  } while(cuplate);

  FILE *fout = fopen("cuplaj.out", "w");
  fprintf(fout, "%d\n", cuplaj);
  for(int i = 1; i <= n; ++i)
    if(r[i] != 0)
      fprintf(fout, "%d %d\n", i, r[i]);
  fclose(fout);
  return 0;
}