Cod sursa(job #660250)

Utilizator Smaug-Andrei C. Smaug- Data 11 ianuarie 2012 22:42:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

#define MAXN 10010

int use[MAXN], r[MAXN], l[MAXN];
vector<int> G[MAXN];

int pairup(int n){
  if(use[n])
    return 0;
  use[n]=1;

  vector<int>::iterator i;
  for(i=G[n].begin(); i!=G[n].end(); i++)
    if(!r[*i]){
      l[n]=*i;
      r[*i]=n;
      return 1;
    }
  for(i=G[n].begin(); i!=G[n].end(); i++)
    if(r[*i] && pairup(r[*i])){
      l[n]=*i;
      r[*i]=n;
      return 1;
    }
  
  return 0;

}
    
int main(){

  freopen("cuplaj.in", "r", stdin);
  freopen("cuplaj.out", "w", stdout);

  int N, M, E, i, ok, c, a, b;

  scanf("%d%d%d\n", &N, &M, &E);
  for(i=1; i<=E; i++){
    scanf("%d%d", &a, &b);
    G[a].push_back(b);
  }

  do {
    ok=0;
    memset(use, 0, sizeof(use));
    for(i=1; i<=N; i++)
      if(!l[i])
	ok|=pairup(i);
  } while(ok);
  
  c=0;
  for(i=1; i<=N; i++)
    if(l[i])
      c++;
  printf("%d\n", c);
  for(i=1; i<=N; i++)
    if(l[i])
      printf("%d %d\n", i, l[i]);

  return 0;

}