Pagini recente » Cod sursa (job #1099501) | Cod sursa (job #2855625) | Cod sursa (job #1671774) | Cod sursa (job #865609) | Cod sursa (job #2189142)
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int i,flux,j,x,y,c,n,m,s,d,q[1001],viz[1001],F[1001][1001],C[1001][1001],G[1001][1001];
void read()
{
f>>n>>m;
s=1;
d=n;
for(i=1;i<=m;++i)
{
f>>x>>y>>c;
C[x][y]=c;
++G[x][0];
G[x][G[x][0]]=y;
++G[y][0];
G[y][G[y][0]]=x;
}
}
int bfs()
{
int i,u,p,x;
p=1;
u=1;
q[p]=s;
viz[s]=1;
while(p<=u && !viz[d])
{
x=q[p];
++p;
if(x==n)
continue;
for(i=1;i<=G[x][0];++i)
if(!viz[G[x][i]])
if(F[x][G[x][i]]<C[x][G[x][i]])
{
q[++u]=G[x][i];
viz[G[x][i]]=x;
}
}
if(viz[d])
return 0;
return 1;
}
void ek()
{
int i,a,b,lg,v;
int L[1001];
do
{
memset(viz, 0, sizeof(viz));
if(bfs())
return;
int nod=n;
a=110001;
while(nod!=1)
for(i=1;i<=G[n][0];++i)
{
nod=G[n][i];
if(viz[nod]==0 || C[nod][n]==F[nod][n])
continue;
a=min(a,C[viz[nod]][nod]-F[viz[nod]][nod]);
nod=viz[nod];
}
v=a;
nod=n;
while(nod!=1)
{
F[viz[nod]][nod]+=v;
F[nod][viz[nod]]-=v;
nod=viz[nod];
}
flux=flux+v;
}while(1);
}
void afis()
{
g<<flux<<'\n';
}
int main()
{
read();
ek();
afis();
return 0;
}