Pagini recente » Cod sursa (job #867807) | Cod sursa (job #1463421) | Cod sursa (job #1286923) | Cod sursa (job #2240734) | Cod sursa (job #425623)
Cod sursa(job #425623)
#include<fstream>
#define MAX 100000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,S,T,flow;
int c[1001][1001],f[1001][1001],x[1001],t[1001],pus[1001],r[1001];
void augment()
{ int j=T,i;
while(j!=S)
{ i=abs(t[j]);
if(t[j]>=0) f[i][j]+=r[T];
else f[j][i]-=r[T];
j=i;
}
flow+=r[T];
}
int bf()
{ int st=1,dr=1,i;
for(i=1;i<=T;i++)
{ t[i]=0;
pus[i]=0;
x[i]=0;
}
x[1]=S;
pus[S]=1;
r[S]=MAX;
while(st<=dr)
{ int nod=x[st];
for(i=1;i<=T;i++)
if(pus[i]==0)
{ if(c[nod][i]>f[nod][i])
{ x[++dr]=i;
pus[i]=1;
t[i]=nod;
if(c[nod][i]-f[nod][i]<r[nod])
r[i]=c[nod][i]-f[nod][i];
else r[i]=r[nod];
if(i==T) return 1;
}
if(f[i][nod])
{ x[++dr]=i;
pus[i]=1;
t[i]=-nod;
if(f[i][nod]<r[nod])
r[i]=f[i][nod];
else r[i]=r[nod];
if(i==T) return 1;
}
}
st++;
}
return 0;
}
void flux()
{ while(bf())
augment();
}
int main()
{ int i,x,y,z;
fin>>n>>m;
for(i=1;i<=m;i++)
{ fin>>x>>y>>z;
c[x][y]=z;
}
S=1;
T=n;
flux();
fout<<flow;
fin.close();
fout.close();
return 0;
}