Cod sursa(job #256742)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 12 februarie 2009 06:45:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <iostream.h>

#define IN "cuplaj.in"
#define OUT "cuplaj.out"
#define MAX 10005

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

struct NOD
{
 int nod;
 NOD *next;
}*A[MAX];

int dest[MAX];
int p[MAX];
int v[MAX];

int N,M,e;
int cnt;

void cuplaj();
void pairup();

int main ()
{
 int i,a,b;

 fscanf(fin,"%d %d %d",&N,&M,&e);

 for(i=1;i<=e;++i)
 {
  fscanf(fin,"%d %d",&a,&b);
  NOD *q=new (NOD);
  q->nod=b;
  q->next=A[a];
  A[a]=q;
 }

 cuplaj();

 return 0;
}

int pairup(int nod)
{
 v[nod]=1;

 for(NOD *q = A[nod]; q != NULL; q = q->next)
  if (!dest[q->nod])
  {
   dest[q->nod] = nod;
   p[nod] = q->nod;
   return 1;
  }
 for (NOD *q = A[nod]; q != NULL; q = q->next)
  if (!v[dest[q->nod]])
   if (pairup(dest[q->nod]))
   {
    dest[q->nod] = nod;
    p[nod] = q->nod;
    return 1;
   }
 return 0;
}

void cuplaj ()
{
 int ok,i;
 ok=1;

 while (ok)
 {
  ok=0;

  memset(v,0,sizeof(v));

  for(i=1;i<=N;++i)
   if(!p[i])
    if(pairup(i))
    {
     ok=1;
     ++cnt;
    }
 }
 fprintf(fout,"%d\n",cnt);
 for(i=1;i<=N;++i)
  if(p[i])
   fprintf(fout,"%d %d\n",i,p[i]);
}