Mai intai trebuie sa te autentifici.

Cod sursa(job #565525)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 27 martie 2011 21:12:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int N = 10005;

int n, m, per, left_pair[N], right_pair[N];

vector<int> L[N];

bool f[N];

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

void reset(bool f[N]) {
  for (int i = 1; i <= n; ++ i)
    f[i] = 0;
}

bool cupleaza(int nod) {
  if (f[nod])
    return 0;
  f[nod] = 1;
  for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it) 
    if (! right_pair[*it]) {
      left_pair[nod] = *it;
      right_pair[*it] = nod;
      return 1;
    }
  for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it) 
    if (right_pair[*it] && cupleaza(right_pair[*it])) {
      left_pair[nod] = *it;
      right_pair[*it] = nod;
      return 1;
    }
  return 0;
}

void solve() {
  bool ok = true;
  
  while(ok) {
    ok = false;
    reset(f);
    for (int i = 1; i <= n; ++ i) 
      if (!left_pair[i] && cupleaza(i)) {
        ok = true;
        ++ per;
      }
  }
}

void afis() {
  out << per << '\n';
  for (int i = 1; i <=n ; ++ i)
    if (left_pair[i])
      out << i << ' ' << left_pair[i] << '\n';
}
int main() {
  read();
  solve();
  afis();
  return 0;
}