Cod sursa(job #280648)

Utilizator petrecgClinciu Glisca Petre petrecg Data 13 martie 2009 15:06:44
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>   
#include <string.h>   
int p,u,s[1005],i,n,l,parinte[1005],c[1005][1005],m,x,y,z,fluxm,min,x1,y1,c1[1005][1005],j;
int bf()   
{ p=1; u=1; s[p]=n+1;
  while(p<=u)   
   {for(i=1;i<=n+2;i++) if(!parinte[i]&&c[s[p]][i]&&i!=n+1) { u++; s[u]=i; parinte[i]=s[p]; }
    p++;   
   }   
  if(parinte[n+2])return 1;else return 0;
}   
int main()
{ freopen("cuplaj.in","r",stdin); freopen("cuplaj.out","w",stdout);
  scanf("%d%d%d",&x1,&y1,&m);n=x1+y1;
  for(i=1;i<=m;i++)   
   { scanf("%d%d",&x,&y);
     c[x][y+x1]=1;c1[x][y+x1]=1;
   }
  for(i=1;i<=x1;i++)c[n+1][i]=1;
  for(i=1;i<=y1;i++)c[x1+i][n+2]=1;
  while(bf())
   {for(i=1;i<=n+2;i++)
    {
     if(parinte[i]<=0||c[i][n+2]<=0)continue;
     min=c[i][n+2]; x=i;
     while(parinte[x])
      { if(c[parinte[x]][x]<min) min=c[parinte[x]][x];
     x=parinte[x];
      }
     x=i;fluxm+=min;c[i][n+2]-=min;c[n+2][i]+=min;
     while(parinte[x])
      { c[parinte[x]][x]-=min;
    c[x][parinte[x]]+=min;
    x=parinte[x];
      }

    }
    memset(parinte,0,sizeof(parinte));
   }
 printf("%d\n",fluxm);l=0;
 for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   if(c[i][j]!=c1[i][j]){l++;if(l<=fluxm)printf("%d %d\n",i,j-x1);}
 fclose(stdout);   
 return 0;   
}