Pagini recente » Cod sursa (job #1912431) | template/preoni-2007/footer | Cod sursa (job #233598) | Cod sursa (job #651390) | Cod sursa (job #1176368)
#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> G[MAX];
typedef vector <int> :: iterator iter;
int viz[MAX], nod, C[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=G[nod].begin();it!=G[nod].end();it++)
{
if(!viz[*it] && F[nod][*it]!=C[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;
G[a].pb(b);
G[b].pb(a);
C[a][b]=c;
}
int i;
int flow=0;
while(bf())
{
for(iter it=G[n].begin();it!=G[n].end();it++)
{
dad[n]=*it;
if(F[*it][n]==C[*it][n] || !viz[*it])
continue;
minim=INF;
for(i=n;i!=1;i=dad[i])
{
minim=min(minim, C[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;
}