Cod sursa(job #1010227)

Utilizator crushackPopescu Silviu crushack Data 14 octombrie 2013 16:07:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMax 10010
using namespace std;

const char IN[] = "cuplaj.in", OUT[] = "cuplaj.out";

int N, M, K, Rez;
int L[NMax], R[NMax];
bool visit[NMax];
vector<int> ad[NMax];

bool cupleaza(int x) {

  if (visit[x]) return false;
  visit[x] = true;
  for (int i = 0 ; i < (int) ad[x].size(); ++ i ) if ( !R[ad[x][i]] ) {
    R[ad[x][i]] = x;
    L[x] = ad[x][i];
    return true;
  }

  for (int i = 0 ; i < (int) ad[x].size(); ++ i ) 
    if ( cupleaza(R[ad[x][i]]) ) {
      R[ad[x][i]] = x;
      L[x] = ad[x][i];
      return true;
    }
  return false;
}

int main() {

  int x, y;
  freopen(IN, "r", stdin);
  scanf("%d%d%d", &N, &M, &K);
  for (int i = 1 ; i <= K ; ++ i ) {
    scanf("%d%d", &x, &y);
    ad[x].push_back(y);
  }

  for ( int s = 1; s ; ) {
    s = 0;
    memset(visit, 0, sizeof(visit));
    for (int i = 1; i <= N ; ++ i) if ( !L[i] )
      s |= cupleaza(i);
  }

  for (int i = 1; i <= N ; ++ i) Rez += ( L[i] != 0 );

  freopen(OUT, "w", stdout);
  printf("%d\n", Rez);
  for (int i = 1; i <= N ; ++ i ) if ( L[i] )
    printf("%d %d\n", i, L[i]);
  fclose(stdout);
  return 0;
}