Pagini recente » Cod sursa (job #3154028) | Cod sursa (job #2863871) | Cod sursa (job #605895) | Cod sursa (job #702174) | Cod sursa (job #279866)
Cod sursa(job #279866)
#include<stdio.h>
#include <string.h>
int p,u,s[10005],i,n,parinte[10005],c[10005][10005],m,x,y,z,fluxm,min,x1,y1;
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;
}
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",fluxm);
fclose(stdout);
return 0;
}