Cod sursa(job #875225)

Utilizator vlad_DVlad Dumitriu vlad_D Data 9 februarie 2013 20:20:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#include <string.h>
#include <vector>

using namespace std;

namespace cup {
int n, m;
vector<vector<int> > G;
int L[10100], R[10100], viz[10100];
int pair_up(int nod) {
  if (viz[nod]) return 0;
  viz[nod] = 1;
  for (int i = 0; i < G[nod].size(); ++i) {
    int nod2 = G[nod][i];
    if (R[nod2] == 0 || pair_up(R[nod2])) {
      L[nod] = nod2; R[nod2] = nod;
      return 1;
    }
  }
  return 0;
}
int cuplaj() {
  int ok = 1;
  while (ok) {
    ok = 0;
    memset(viz, 0, sizeof(viz));
    for (int i = 1; i <= n; ++i) if (L[i] == 0) ok |= pair_up(i);
  }
  int flux = 0;
  for (int i = 1; i <= n; ++i) flux += L[i] > 0;
  return flux;
}
void clear() {
  n = m = 0; G.clear(); memset(L, 0, sizeof(L)); memset(R, 0, sizeof(R)); memset(viz, 0, sizeof(viz));
}
void adapt();
}

namespace in {
int N, M, E;
int EE[100001][2];
}
using namespace in;
int main() {
  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);
  scanf("%d %d %d", &N, &M, &E);
  for (int i = 1; i <= E; ++i) scanf("%d %d", &EE[i][0], &EE[i][1]);
  cup::adapt();
  return 0;
}

void cup::adapt() {
  n = in::N; m = in::M;
  G.resize(n + 1);
  for (int i = 1; i <= E; ++i) G[EE[i][0]].push_back(EE[i][1]);
  printf("%d\n", cuplaj());
  for (int i = 1; i <= n; ++i) if (L[i]) printf("%d %d\n", i, L[i]);
}