Cod sursa(job #302644)

Utilizator rethosPaicu Alexandru rethos Data 9 aprilie 2009 09:34:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
#include <string.h>
#define NM 20001
int nrst,nrdr,e,f;
struct list{int nod;list *urm;} *g[NM];
int viz[NM];
int st[NM],dr[NM];
inline void add(int x,int y)
{list *p=new list;
 p->nod=y;
 p->urm=g[x];
 g[x]=p;
}
int pair(int k)
{if (viz[k]) return 0;
 viz[k]=1;
 list *p;
 for (p=g[k];p;p=p->urm)
	 if (!dr[p->nod]) 
		 {dr[p->nod]=k;
		  st[k]=p->nod;
		  return 1;
		 }
 for (p=g[k];p;p=p->urm)
	 if (pair(dr[p->nod]))
		 {st[k]=p->nod;
		  dr[p->nod]=k;
		  return 1;
		 } 
 return 0;		 
}
int main()
{freopen("cuplaj.in","r",stdin);
 freopen("cuplaj.out","w",stdout);
 scanf("%d %d %d",&nrst,&nrdr,&e);
 int i,x,y;
 for (i=1;i<=e;i++)
	 {scanf("%d %d",&x,&y);
	  add(x,y);
	 }
 int sw=1;
 while (sw)
	 {sw=0;
	  memset(viz,0,sizeof(viz));
	  for (i=1;i<=nrst;i++)
		  if (!st[i]) sw=sw+pair(i);
	 }
 for (i=1;i<=nrst;i++) if (st[i]) f++;
 printf("%d\n",f);
 for (i=1;i<=nrst;i++)
	 if (st[i]) printf("%d %d\n",i,st[i]);
 return 0;
}