Cod sursa(job #348751)

Utilizator ionutz32Ilie Ionut ionutz32 Data 16 septembrie 2009 19:12:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
struct nod
{
       int nr;
       nod *adr;
};
nod *v[10005],*u;
int n,m,e,i,a,b,k,s[10005],st[10005],dr[10005],nr;
int pairup(int p)
{
    nod *j;
    if (s[p]==0)
    {
       s[p]=1;
       for (j=v[p];j!=NULL;j=j->adr)
	   if (dr[j->nr]==0)
	   {
	      st[p]=j->nr;
	      dr[j->nr]=p;
	      return 1;
	   }
       for (j=v[p];j!=NULL;j=j->adr)
	   if (pairup(dr[j->nr])==1)
	   {
	      st[p]=j->nr;
	      dr[j->nr]=p;
	      return 1;
	   }
       return 0;
    }
    else
	return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d",&n,&m,&e);
    for (i=1;i<=e;++i)
    {
	scanf("%d %d",&a,&b);
	if (v[a]==NULL)
	{
	   v[a]=new nod;
	   v[a]->nr=b;
	   v[a]->adr=NULL;
	}
	else
	{
	    u=new nod;
	    u->nr=b;
	    u->adr=v[a];
	    v[a]=u;
	}
    }
    do
    {
      k=1;
      for (i=1;i<=n;++i)
	  s[i]=0;
      for (i=1;i<=n;++i)
	  if (st[i]==0)
	     if (pairup(i))
		k=0;
    }
    while (k==0);
    nr=0;
    for (i=1;i<=n;++i)
	if (st[i])
	   ++nr;
    printf("%d\n",nr);
    for (i=1;i<=n;++i)
	if (st[i])
	   printf("%d %d\n",i,st[i]);
    return 0;
}