Cod sursa(job #2242074)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 17 septembrie 2018 18:37:26
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

vector<int>G[10002];
int st[10002], dr[10002];
int n, m, e, x, y;
bool viz[10002];

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");

bool cuplaj (int x) {
  if (viz[x])
    return 0;
  viz[x] = 1;
  for (int i = 0; i < G[x].size(); i++) {
    int v = G[x][i];
    if (!dr[v]) {
      st[x] = v;
      dr[v] = x;
      return 1;
    }
  }
  for (int i = 0; i < G[x].size(); i++) {
    int v = G[x][i];
    if (cuplaj(dr[v])) {
      st[x] = v;
      dr[v] = x;
      return 1;
    }
  }
  return 0;
}

int main()
{
  fin >> n >> m >> e;
  for (int i = 1; i <= e; i++) {
    fin >> x >> y;
    G[x].push_back(y);
  }
  bool ok = 1;
  while (ok) {
    ok = 0;
    memset(viz, 0, sizeof(viz));
    for (int i = 1; i <= n; i++) {
      if (!st[i])
        if (cuplaj(i))
          ok = 1;
    }
  }
  int sol = 0;
  for (int i = 1; i <= n; i++)
    if (st[i])
      sol++;
  fout << sol << "\n";
  for (int i = 1; i <= n; i++)
    if (st[i])
      fout << i << " " << st[i] << "\n";
  return 0;
}