Cod sursa(job #917413)
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#define inf 1<<30
#define pb push_back
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,i,j,Fluxmax, Fluxct, F[1001][10001], C[1001][1001], T[1001],nod;
vector<int> G[1001];
int uz[1001];
queue<int> q;
int bf()
{
int NOD=0;
memset(uz,0,sizeof(uz));
q.push(1);
uz[1]=1;
while(!q.empty())
{
NOD=q.front();
if(NOD!=n)
for(i=0;i<G[NOD].size();++i)
if(!uz[G[NOD][i]]&& F[NOD][G[NOD][i]] < C[NOD][G[NOD][i]] )
{
uz[G[NOD][i]]=1;
T[G[NOD][i]]=NOD;
q.push(G[NOD][i]);
}
q.pop();
}
return uz[n];
}
int main()
{
int x,y,cost;
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y>>cost;
C[x][y]=cost;
G[x].pb(y);
G[y].pb(x);
}
Fluxmax=0;
while(bf())
{
for(i=0;i<G[n].size();i++)
if(uz[G[n][i]]&&F[G[n][i]][n]<C[G[n][i]] [n])
{
T[n]=G[n][i];
Fluxct=inf;
for(nod=n;nod!=1;nod=T[nod])
Fluxct=min(Fluxct,C[T[nod]][nod]);
if(Fluxct)
{
nod=n;
for(nod=n;nod!=1;nod=T[nod])
{
C[T[nod]][nod]-=Fluxct;
C[nod][T[nod]]+=Fluxct;
}
}
Fluxmax+=Fluxct;
}
}
g<<Fluxmax;
return 0;
}