Cod sursa(job #313004)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 7 mai 2009 17:57:47
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdlib.h>
#include <stdio.h>
#define M 200001
#define N 10001
int p[N],urm[M],muc[M],s,d,e,vf;
int leg[N],tata[N],viz[N];
typedef struct
{int n;
 struct nod *urm;
}nod;
nod *prim,*ultim;

void adaugam(int a,int b)
{muc[vf]=b;
 urm[vf]=p[a];
 p[a]=vf;
 vf++;
}

void push(int k)
{nod *p=(nod*)malloc(sizeof(nod));
 p->n=k;
 p->urm=NULL;
 if(prim==NULL)
 {prim=p;
 }
 else
 {ultim->urm=p;
 }
 ultim=p;
}
void sterge()
{nod *p;
 p=prim;
 prim=prim->urm;
 free (p);
}

int bf(int k)
{if(leg[k]!=0) return;
 push(k);
 viz[k]=1;
 int i;
 while(prim!=NULL)
 {if(prim->n<=s)
  {//if(leg[prim->n]==0)
   {for (i=p[prim->n];i;i=urm[i])
    {if(viz[muc[i]]==0)
     {tata[muc[i]]=prim->n;
      push(muc[i]);
      viz[muc[i]]=1;
     }
    }
   }
  }
  else
  {if(leg[prim->n]==0)
   {return prim->n;
   }
   for (i=p[prim->n];i;i=urm[i])
   {if(leg[muc[i]]==prim->n&&viz[muc[i]]==0)
    {viz[muc[i]]=1;
     push(muc[i]);
     tata[muc[i]]=prim->n;
    }
   }
  }
  sterge();
 }
}

int main ()
{int i,j,k,a,b,count;
 freopen("cuplaj.in","r",stdin);
 freopen("cuplaj.out","w",stdout);
 scanf("%d %d %d",&s,&d,&e);
 for(vf=1,i=1;i<=e;i++)
 {scanf("%d %d",&a,&b);
  adaugam(a,b+s);
  adaugam(b+s,a);
 }
 prim=ultim=NULL;
 for (i=1;i<=s;i++)
 {memset(viz,0,sizeof(viz));
  memset(tata,0,sizeof(viz));
  while(prim!=NULL)sterge();
  k=bf(i);
  for (j=k;j;j=tata[j])
  {if(j>s)
   {leg[j]=tata[j];
    leg[tata[j]]=j;
   }
   else
   {leg[tata[j]]=0;
   }
  }
 }
 for (i=1,count=0;i<=s;i++)
 {if(leg[i]!=0) count++;
 }
 printf("%d\n",count);
 for (i=1;i<=s;i++)
 {if(leg[i]!=0)
  {printf("%d %d\n",i,leg[i]-s);
  }
 }
 
 return 0;
}