Cod sursa(job #771420)

Utilizator igsifvevc avb igsi Data 25 iulie 2012 22:16:18
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXN 10005

struct list{
  int v;
  struct list *n;
} *G[MAXN];

int left[MAXN], right[MAXN], L, R, nr;
char used[MAXN];

char matching(int i)
{
  struct list *p;
  if(used[i]) return 0;
  used[i] = 1;

  for(p = G[i]; p; p = p->n)
    if(!right[p->v])
    {
      left[i] = p->v;
      right[p->v] = i;
      return 1;
    }
  for(p = G[i]; p; p = p->n)
    if(matching(right[p->v]))
    {
      left[i] = p->v;
      right[p->v] = i;
      return 1;
    }

  return 0;
}

int main()
{
  int i, a, b;
  struct list *p;
  FILE *in = fopen("cuplaj.in", "r");
  FILE *out = fopen("cuplaj.out", "w");
  
  fscanf(in, "%d %d %d", &L, &R, &i);
  for(; i; --i)
  {
    fscanf(in, "%d %d", &a, &b);
    p = malloc(sizeof(struct list));
    p->v = b;
    p->n = G[a];
    G[a] = p;
  }
  
  for(i = 1; i <= L; ++i)
  {
    if( left[i] ) 
      continue; 
    else if( matching(i) ) 
      nr++;
    else
    {
      memset(used, 0, sizeof(used));
      if( matching(i) ) 
        nr++;
    }
  }

  fprintf(out, "%d\n", nr);
  for(i = 1; i <= L; ++i)
    if( left[i] )
      fprintf(out, "%d %d\n", i, left[i]);

  fclose(in);
  fclose(out);
  return 0;
}