Pagini recente » Cod sursa (job #1872210) | Cod sursa (job #2102588) | Cod sursa (job #394657) | Cod sursa (job #1663461) | Cod sursa (job #1438450)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <bitset>
#include <utility>
using namespace std;
#define Nmax 1002
#define inf 0x3f3f3f3f
FILE *f = fopen ( "maxflow.in", "r" );
FILE *g = fopen ( "maxflow.out", "w" );
int cap[Nmax][Nmax], flow[Nmax][Nmax], tata[Nmax], maxflow, Source, Dest, N, M;
vector < int > G[Nmax];
bitset < Nmax > used;
queue < int > Q;
void Init (){
used.reset();
while ( !Q.empty() )
Q.pop();
Q.push ( Source );
used[Source] = 1;
}
int BFS (){
Init();
vector < int > :: iterator it;
while ( !Q.empty() ){
int nod = Q.front();
Q.pop();
if ( nod == Dest )
break;
for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
if ( !used[*it] && flow[nod][*it] < cap[nod][*it] ){
used[*it] = 1;
tata[*it] = nod;
Q.push ( *it );
}
}
}
return used[Dest];
}
void Flow (){
int fmin;
vector < int > :: iterator it;
while ( BFS() ){
for ( it = G[Dest].begin(); it < G[Dest].end(); ++it ){
int nod = *it;
if ( !used[nod] || cap[nod][Dest] == flow[nod][Dest] )
continue;
tata[Dest] = nod;
fmin = inf;
for ( nod = Dest; nod != Source; nod = tata[nod] )
fmin = min ( fmin, cap[tata[nod]][nod] - flow[tata[nod]][nod] );
if ( !fmin )
continue;
for ( nod = Dest; nod != Source; nod = tata[nod] ){
flow[tata[nod]][nod] += fmin;
flow[nod][tata[nod]] -= fmin;
}
maxflow += fmin;
}
}
}
int main(){
int x, y, c;
fscanf ( f, "%d%d", &N, &M );
Source = 1;
Dest = N;
for ( int i = 1; i <= M; ++i ){
fscanf ( f, "%d%d%d", &x, &y, &c );
cap[x][y] += c;
G[x].push_back ( y );
G[y].push_back ( x );
}
Flow();
fprintf ( g, "%d", maxflow );
return 0;
}