Pagini recente » Cod sursa (job #1165173) | Cod sursa (job #1104926) | Cod sursa (job #510578) | Cod sursa (job #2480121) | Cod sursa (job #2770902)
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int NMAX = 1e3;
int flow[NMAX + 1][NMAX + 1];
vector <int> edges[NMAX + 1];
int p[NMAX + 1];
deque <int> dq;
void reset() {
memset( p, 0, sizeof(p) );
}
bool bfs( int s, int d ) {
reset();
p[s] = -1;
dq.clear();
dq.push_back( s );
while ( !dq.empty() ) {
int node = dq.front();
dq.pop_front();
if ( node == d )
return true;
for ( auto i : edges[node] ) {
if ( flow[node][i] > 0 && !p[i] ) {
p[i] = node;
dq.push_back( i );
}
}
}
return false;
}
int main() {
ifstream fin( "maxflow.in" );
ofstream fout( "maxflow.out" );
int n, m, a, b, c, i, s, d, maxflow, totalflow = 0;
fin >> n >> m;
for ( i = 0; i < m; i ++ ) {
fin >> a >> b >> c;
flow[a][b] = c;
if ( !flow[b][a] ) {
edges[a].push_back( b );
edges[b].push_back( a );
}
}
for ( i = 1; i <= n; i ++ ) {
random_shuffle( edges[i].begin(), edges[i].end() );
}
totalflow = 0;
s = 1;
d = n;
while ( bfs( s, d ) ) {
for ( auto node : edges[d] ) {
if ( flow[node][d] > 0 && p[node] ) {
maxflow = flow[node][d];
for ( i = node; i != s; i = p[i] ) {
maxflow = min( maxflow, flow[p[i]][i] );
}
totalflow += maxflow;
flow[node][d] -= maxflow;
flow[d][node] += maxflow;
for ( i = node; i != s; i = p[i] ) {
flow[p[i]][i] -= maxflow;
flow[i][p[i]] += maxflow;
}
}
}
}
fout << totalflow;
return 0;
}