Cod sursa(job #765388)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 7 iulie 2012 13:42:12
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#define N 10001
int a[10*N],b[10*N],deg[N],*g[N],i,j,k,v[N],d[N],p1[N],p2[N],n,m,e,mg;

int B()
{int i,j,k,q[10*N],p=0,u=0;
for(i=1;i<=n;i++)
if(!p1[i])
      d[i]=0,q[u++]=i;
else
      d[i]=10*N;
d[0]=10*N;
while(p<u)
if((j=q[p++]))
      for(k=0;k<deg[j];k++)
      if(d[p2[g[j][k]]]==10*N)
             d[p2[g[j][k]]]=d[j]+1,q[u++]=p2[g[j][k]];
return d[0]!=10*N;}

int D(int i)
{if(i)
      {for(int j=0;j<deg[i];j++)
      if(d[p2[g[i][j]]]==d[i]+1&&D(p2[g[i][j]])==1)
              {p2[g[i][j]]=i;
              p1[i]=g[i][j];
              return 1;}
      d[i]=10*N;
      return 0;}
return 1;}

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[i],&b[i]),deg[a[i]]++;
for(j=1;j<=n;deg[j++]=0)
      g[j]=new int[deg[j]];
for(k=1;k<=e;k++)
      g[a[k]][deg[a[k]]++]=b[k];
while(B())
      for(j=1;j<=n;j++)
      if(!p1[j]&&D(j))
              v[++mg]=j;
printf("%d\n",mg);
for(i=1;i<=mg;i++)
      printf("%d %d\n",p2[p1[v[i]]],p1[v[i]]);
return 0;}