Pagini recente » Cod sursa (job #1467384) | Cod sursa (job #2611051) | Cod sursa (job #1132272) | Cod sursa (job #1166958) | Cod sursa (job #901932)
Cod sursa(job #901932)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define NMAX 1001
#define INF 0x3f3f3f3f
#define pb push_back
int F[NMAX][NMAX], C[NMAX][NMAX];
int Dist[NMAX];
int T[NMAX];
int N, M, x, y, c, i, MaxFlow, FlowCt, Nod;
vector< int > G[NMAX];
bool USED[NMAX];
inline bool BF()
{
memset( USED, false, sizeof(USED) );
USED[1] = true;
queue< int > Q;
Q.push( 1 );
memset( T, 0, sizeof(T) );
while( !Q.empty() )
{
Nod = Q.front();
Q.pop();
for( vector< int >::iterator it = G[Nod].begin(); it != G[Nod].end(); ++it )
if( !USED[*it] && F[Nod][*it] < C[Nod][*it] )
{
USED[*it] = true;
Q.push( *it );
T[*it] = Nod;
}
}
return USED[N];
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
memset( C, 0, sizeof(C) );
while( M-- )
{
scanf("%d%d%d", &x, &y, &c);
C[x][y] = c;
G[x].pb( y );
G[y].pb( x );
}
memset( F, 0, sizeof(F) );
MaxFlow = 0;
while( BF() )
for( i = 1; i < N; ++i )
if( T[i] && F[i][N] < C[i][N] )
{
FlowCt = C[i][N] - F[i][N];
for( Nod = i; Nod != 1; Nod = T[Nod] )
FlowCt = min( FlowCt, C[T[Nod]][Nod] - F[T[Nod]][Nod] );
if( FlowCt )
{
F[i][N] += FlowCt; F[N][i] -= FlowCt;
for( Nod = i; Nod != 1; Nod = T[Nod] )
F[T[Nod]][Nod] += FlowCt, F[Nod][T[Nod]] -= FlowCt;
MaxFlow += FlowCt;
}
}
printf("%d\n", MaxFlow);
return 0;
}