Pagini recente » Cod sursa (job #467322) | Cod sursa (job #68816) | Cod sursa (job #3138277) | Cod sursa (job #2248359) | Cod sursa (job #3039782)
#include <fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int Nmax=3e4;
int n,m,x[Nmax],y[Nmax],C[Nmax],urm[Nmax],L[1002],k=-1,flow,c[1002],Min,p[1002],lev[1002],t[1002];
bool viz[1002];
void Add(int x1, int x2, int cap)
{
urm[++k]=L[x1];
x[k]=x1;
y[k]=x2;
C[k]=cap;
L[x1]=k;
}
bool BFS()
{
int inc,sf,nc,i,z;
for (i=1;i<=n;i++)
viz[i]=0;
inc=sf=c[1]=viz[1]=lev[1]=1;
while (inc<=sf)
{
nc=c[inc];
z=L[nc];
while (z!=-1)
{
if (!viz[y[z]] and C[z]>0)
{
viz[y[z]]=1;
c[++sf]=y[z];
lev[y[z]]=lev[nc]+1;
}
z=urm[z];
}
inc++;
}
return viz[n];
}
int DFS(int nc, int pushed)
{
if (pushed==0)
return 0;
if (nc==n)
return pushed;
int Min;
int &z=p[nc];
while (z!=-1)
{
if (lev[nc]+1==lev[y[z]] and C[z]>0)
{
Min=DFS(y[z],min(pushed,C[z]));
if (Min)
{
C[z]-=Min;
C[z^1]+=Min;
return Min;
}
}
z=urm[z];
}
return 0;
}
int main()
{
int i,x1,x2,cap,pushed;
f >> n >> m;
for (i=1;i<=n;i++)
L[i]=-1;
for (i=1;i<=m;i++)
{
f >> x1 >> x2 >> cap;
Add(x1,x2,cap);
Add(x2,x1,0);
}
while (BFS())
{
for (i=1;i<=n;i++)
p[i]=L[i];
do
{
pushed=DFS(1,2e9);
flow+=pushed;
}while (pushed);
}
g << flow;
return 0;
}