Pagini recente » Cod sursa (job #605633) | Cod sursa (job #2201150) | Cod sursa (job #128875) | Cod sursa (job #1528339) | Cod sursa (job #702903)
Cod sursa(job #702903)
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define NMAX 1001
#define pb push_back
int N, M, i, x, y, c, Flux, Adaug, Nod;
int Cap[NMAX][NMAX], F[NMAX][NMAX], T[NMAX];
vector< int > G[NMAX];
bool Used[NMAX];
inline bool BF()
{
memset( Used, false, sizeof(Used) );
Used[1] = true;
memset( T, 0, sizeof(T) );
T[1] = -1;
queue< int > Q;
Q.push( 1 );
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] < Cap[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( Cap, 0, sizeof(Cap) );
for( ; M--; )
{
scanf("%d%d%d", &x, &y, &c );
G[x].pb( y );
G[y].pb( x );
Cap[x][y] = c;
}
memset( F, 0, sizeof(F) );
for( Flux = 0; BF(); )
for( i = 1; i < N; ++i )
if( T[i] && F[i][N] < Cap[i][N] )
{
Adaug = Cap[i][N] - F[i][N];
for( Nod = i; Nod != 1; Nod = T[Nod] )
Adaug = min( Adaug, Cap[ T[Nod] ][Nod] - F[ T[Nod] ][Nod] );
if( !Adaug ) continue;
F[i][N] += Adaug, F[N][i] -= Adaug;
for( Nod = i; Nod != 1; Nod = T[Nod] )
F[ T[Nod] ][Nod] += Adaug, F[Nod][ T[Nod] ] -= Adaug;
Flux += Adaug;
}
printf("%d\n", Flux );
return 0;
}