Pagini recente » moisil2017-1112 | Cod sursa (job #1151292) | Cod sursa (job #2008843) | Cod sursa (job #1520367) | Cod sursa (job #1178418)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define MAX 1010
#define pb push_back
#define INF 1<<29
queue <int> Q;
vector <int> Graph[MAX];
typedef vector <int> :: iterator iter;
int viz[MAX], nod, Cost[MAX][MAX], F[MAX][MAX], dad[MAX], n, m, a, b, c;
bool bf()
{
memset(viz, 0, sizeof(viz));
Q.push(1);
viz[1]=1;
while(Q.size())
{
nod=Q.front();
Q.pop();
if(nod==n)
continue;
for(iter it=Graph[nod].begin();it!=Graph[nod].end();it++)
{
if(!viz[*it] && F[nod][*it]!=Cost[nod][*it])
{
dad[*it]=nod;
Q.push(*it);
viz[*it]=1;
}
}
}
return viz[n];
}
int main()
{
int minim;
fin>>n>>m;
while(m--)
{
fin>>a>>b>>c;
Graph[a].pb(b);
Graph[b].pb(a);
Cost[a][b]=c;
}
int i;
int flow=0;
while(bf())
{
for(iter it=Graph[n].begin();it!=Graph[n].end();it++)
{
dad[n]=*it;
if(F[*it][n]==Cost[*it][n] || !viz[*it])
continue;
minim=INF;
for(i=n;i!=1;i=dad[i])
{
minim=min(minim, Cost[dad[i]][i]-F[dad[i]][i]);
}
flow+=minim;
for(i=n;i!=1;i=dad[i])
{
F[dad[i]][i]+=minim;
F[i][dad[i]]-=minim;
}
}
}
fout<<flow;
}