Pagini recente » Cod sursa (job #135233) | Cod sursa (job #1753565) | Cod sursa (job #2216835) | Cod sursa (job #805636) | Cod sursa (job #1394424)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <bitset>
using namespace std;
#define Nmax 1002
#define inf 0x3f3f3f3f
#define pb push_back
FILE *f = fopen ( "maxflow.in", "r" );
FILE *g = fopen ( "maxflow.out", "w" );
int cap[Nmax][Nmax], flow[Nmax][Nmax], tata[Nmax], sursa, dest, maxflow;
queue < int > Q;
bitset < Nmax > viz;
vector < int > G[Nmax];
void resetall (){
while ( !Q.empty() )
Q.pop();
viz.reset();
}
bool BFS (){
vector < int > :: iterator it;
resetall();
Q.push ( sursa );
viz[sursa] = 1;
while ( !Q.empty() ){
int nod = Q.front();
if ( nod == dest )
break;
for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
int now = *it;
if ( viz[now] || cap[nod][now] == flow[nod][now] )
continue;
Q.push ( now );
tata[now] = nod;
viz[now] = 1;
}
Q.pop();
}
return viz[dest];
}
void flux(){
int fmin;
vector < int > :: iterator it;
while ( BFS() ){
for ( it = G[dest].begin(); it < G[dest].end(); ++it ){
int now = *it;
if ( flow[now][dest] == cap[now][dest] || !viz[now] )
continue;
tata[dest] = now;
fmin = inf;
for ( now = dest; now != sursa; now = tata[now] )
fmin = min ( fmin, cap[tata[now]][now] - flow[tata[now]][now] );
if ( fmin == 0 )
continue;
for ( now = dest; now != sursa; now = tata[now] ){
flow[tata[now]][now] += fmin;
flow[now][tata[now]] -= fmin;
}
maxflow += fmin;
}
}
}
int main(){
int N, M, x, y, c;
fscanf ( f, "%d%d", &N, &M );
sursa = 1;
dest = N;
for ( int i = 1; i <= M; ++i ){
fscanf ( f, "%d%d%d", &x, &y, &c );
cap[x][y] += c;
G[x].pb ( y );
G[y].pb ( x );
}
flux ();
fprintf ( g, "%d", maxflow );
return 0;
}