Pagini recente » Cod sursa (job #2762864) | Cod sursa (job #2160463) | Cod sursa (job #1450308) | Cod sursa (job #2751422) | Cod sursa (job #457116)
Cod sursa(job #457116)
#include <cstdio>
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>0?x:-x)
#define MAXV 1001
using namespace std;
int n,m,s,d,v[MAXV],q[MAXV];
int c[MAXV][MAXV];//capacitate
int f[MAXV][MAXV];//flux
void citire()
{
freopen("cuplaj.in","r",stdin);
scanf("%d%d", &n, &m);
s=0,d=n+1;
int x,y;
for (int i=0; i<m; i++)
{
scanf("%d%d", &x, &y);
c[x][y]=1;
c[0][x]=1;
c[y][n+1]=1;
}
++n;
}
int bfs()
{
int p,u,x;
q[0]=s;
p=u=0;
v[s]=1;
while (p<=u && !v[d])
{
x=q[p++];
for (int i=1; i<=n; i++)
if (!v[i])
if (f[x][i]<c[x][i])
{
v[i]=x;
q[++u]=i;
}
else if (f[i][x]>0)
{
v[i]=-x;
q[++u]=i;
}
}
return !v[d];
}
void flux()
{
int l[MAXV],a,b,lg,V;
do
{
for (int i=1; i<=n; i++)
v[i]=0;
if (bfs())
return;
l[0]=d;
lg=0;
a=b=10000;
while (l[lg]!=s)
{
l[++lg]=abs(v[l[lg-1]]);
if (v[l[lg-1]]>0)
a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
else
if (v[l[lg-1]]<0)
b=min(b,f[l[lg-1]][l[lg]]);
}
V=min(a,b);
for (int i=lg; i>0; i--)
if (v[l[i-1]]>0)
f[l[i]][l[i-1]]+=V;
else
f[l[i-1]][l[i]]-=V;
}
while (1);
}
void afisare()
{
freopen("cuplaj.out","w",stdout);
int vf=0;
for (int i=1; i<=n; i++)
vf+=f[i][d];
printf("%d\n",vf);
}
int main()
{
citire();
flux();
afisare();
return 0;
}