Pagini recente » Cod sursa (job #2338740) | Cod sursa (job #2018103) | Cod sursa (job #132634) | Cod sursa (job #1505320) | Cod sursa (job #2029956)
#include<cstdio>
using namespace std;
const int inf=200000;
int g[1001][1001];
int pi[1001],cn[1001],d[1001],q[1001],num[1001],n;
void bfs()
{
int i,j,st=0,dr=0;
for(i=1; i<=n; ++i)
{
d[i]=n;
num[n]++;
}
num[n]--;
d[n]=0;
num[0]++;
q[++dr]=n;
while(st!=dr)
{
i=q[++st];
for(j=1; j<=n; ++j)
{
if(d[j]==n&&g[j][i])
{
q[++dr]=j;
num[n]--;
d[j]=d[i]+1;
num[d[j]]++;
}
}
}
}
int marire()
{
int i=n,minim=inf;
while(i!=1)
{
if(g[pi[i]][i]<minim)
minim=g[pi[i]][i];
i=pi[i];
}
i=n;
while(i!=1)
{
g[pi[i]][i]-=minim;
g[i][pi[i]]+=minim;
i=pi[i];
}
return minim;
}
int ret(int &i)
{
int t,j,minim=n-1;
for(j=1; j<=n; ++j)
{
if(g[i][j]>0&&d[j]<minim)
minim=d[j];
}
t=d[i];
num[d[i]]--;
d[i]=1+minim;
num[d[i]]++;
if(i!=1)
i=pi[i];
return num[t];
}
int maxf()
{
int f=0,i,j;
bfs();
for(i=1; i<=n; ++i)
{
cn[i]=1;
}
i=1;
while(d[1]<n)
{
for(j=cn[i]; j<=n; ++j)
{
if(g[i][j]>0&&d[i]==d[j]+1)
break;
}
if(j<=n)
{
cn[i]=j;
pi[j]=i;
i=j;
if(i==n)
{
f+=marire();
i=1;
}
}
else
{
cn[i]=1;
if(!ret(i))
break;
}
}
return f;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int m,i,x,y,c;
scanf("%d%d",&n,&m);
for(i=1; i<=m; ++i)
{
scanf("%d%d%d",&x,&y,&c);
g[x][y]+=c;
}
printf("%d\n",maxf());
return 0;
}