Cod sursa(job #459673)

Utilizator crawlerPuni Andrei Paul crawler Data 30 mai 2010 17:43:23
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.73 kb
#include <stdio.h>
#include <string.h>

char buff[8192];

FILE *fin;
FILE *fout;

#define Nmax 10100
#define Emax 200100 + Nmax

int l[Emax];
int next[Emax];
int last[Nmax];
int next_free;

void init_list() {
  memset(l, 0, sizeof l);
  memset(next, 0, sizeof next);
  next_free = Nmax;
  int i;
  for (i = 0; i < Nmax; ++i)
    last[i] = i;
}

inline void push(int A, int B) {
  l[last[A]] = B;
  next[last[A]] = ++next_free;
  last[A] = next_free;
}

int N,M,E;
int st[Nmax];
int dr[Nmax];
char viz[Nmax];

char cupleaza(int nod) {
  if (viz[nod])
    return 0;

  viz[nod] = 1;

  if (l[nod] == 0)
    return 0;
    
  int it;
  for (it = nod; it != last[nod]; it = next[it])
  if (dr[l[it]] == 0) {
    st[nod] = l[it];
    dr[l[it]] = nod;
    return 1;
  }

  for (it = nod; it != last[nod]; it = next[it])
  if (cupleaza(dr[l[it]])) {
    st[nod] = l[it];
    dr[l[it]] = nod;
    return 1;
  }
  
  return 0;
}

void solve() {
  fscanf(fin, "%d%d%d", &M, &N, &E);
  
  init_list();
  
  int i, a, b;
  for (i = 0; i < E; ++i) {
    fscanf(fin, "%d%d", &a, &b);
    push(a,b);
  }

  memset(st, 0, sizeof st);
  memset(dr, 0, sizeof dr);
  
  char ok = 1;
  
  while (ok) {
    ok = 0;
    memset(viz, 0, sizeof viz);
    int i;
    for (i = 1; i <= M; ++i)
      ok |= cupleaza(i);
  }
  
  int ret = 0;
  
  for (i = 1; i <= M; ++i)
  if (st[i])
    ++ret;

  fprintf(fout , "%d\n", ret);
  
  for (i = 1; i <= M; ++i)
  if (st[i])
    fprintf(fout, "%d %d\n", i, st[i]);
}

int main() {
  fin  = fopen("cuplaj.in" , "r");
  fout = fopen("cuplaj.out", "w");
  setbuf(fin, buff);

  solve();
    
  fclose(fin);
  fclose(fout);
    
  return 0;
}