Pagini recente » Cod sursa (job #2411468) | Cod sursa (job #3290939) | Cod sursa (job #209080) | Cod sursa (job #3249957) | Cod sursa (job #698029)
Cod sursa(job #698029)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define pb push_back
#define Nmax 1005
#define Mmax 5005
#define INF 2147000000
using namespace std;
queue< int > Q;
vector< int > v[Nmax];
int F[Nmax][Nmax],C[Nmax][Nmax];
int prev[Nmax];
int N,M,S,D;
inline int BF()
{
vector< int >:: iterator it;
int f;
memset(prev,0,sizeof(prev));
while( !Q.empty() ) Q.pop();
Q.push(S);
while( ! Q.empty() )
{
f = Q.front();
Q.pop();
if( f == D ) continue;
for( it=v[f].begin(); it!=v[f].end(); ++it)
if( !prev[*it] && C[f][*it] > F[f][*it] )
{
prev[ *it ] = f;
Q.push( *it );
}
}
return prev[D];
}
int main()
{
vector< int >:: iterator it;
int i,x,y,z, flow=0,wh,fmin;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=M;++i)
{
scanf("%d%d%d",&x,&y,&z);
v[x].pb(y);
v[y].pb(x);
C[x][y] = z;
}
S=1; D=N;
while( BF() )
{
for( it=v[D].begin(); it!=v[D].end(); ++it)
if( prev[*it] )
{
prev[D] = *it;
fmin = INF;
for( wh=D; wh!=S; wh=prev[wh] )
fmin = min(fmin, C[prev[wh]][wh] - F[prev[wh]][wh] );
if( !fmin ) continue;
flow += fmin;
for( wh=D; wh!=S; wh=prev[wh] )
{
F[prev[wh]][wh] += fmin;
F[wh][prev[wh]] -= fmin;
}
}
}
printf("%d\n",flow);
fclose(stdin); fclose(stdout);
return 0;
}