Pagini recente » Cod sursa (job #125099) | Cod sursa (job #1259291) | Cod sursa (job #1145201) | Cod sursa (job #2645366) | Cod sursa (job #1206348)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
int n,m,c[1005][1005],f[1005][1005],x,y,z,mda[1005][1005],lista[1005],trecut[1005],prec[1005],sol;
int main()
{
ifstream in ("maxflow.in");
ofstream out ("maxflow.out");
in>>n>>m;
for (int i=1;i<=m;++i)
{
in>>x>>y>>z;
c[x][y]+=z;
mda[x][y]=1;
mda[y][x]=1;
}
bool advr=1;
while (advr==1)
{
memset(trecut,0,4020);
lista[0]=1; lista[1]=1; trecut[1]=1;
for (int i=1;i<=lista[0];++i)
{
int v=lista[i];
if (v!=n)
for (int j=1;j<=n;++j)
{
if (mda[v][j]==1 && trecut[j]==0 && c[v][j]>f[v][j])
{
++lista[0]; lista[lista[0]]=j; trecut[j]=1; prec[j]=v;
}
}
}
if (trecut[n]==1)
{
for (int i=1;i<n;++i)
{
if (mda[i][n]==1 && trecut[i]==1 && c[i][n]>f[i][n])
{
prec[n]=i;
int minim=c[i][n]-f[i][n],v=n;
while (v!=1)
{
if (minim>c[prec[v]][v]-f[prec[v]][v]) minim=c[prec[v]][v]-f[prec[v]][v];
v=prec[v];
}
v=n;
while (v!=1)
{
f[prec[v]][v]+=minim;
f[v][prec[v]]-=minim;
v=prec[v];
}
sol+=minim;
}
}
} else advr=0;
}
out<<sol;
in.close();
out.close();
return 0;
}