Pagini recente » Cod sursa (job #1663904) | Cod sursa (job #2499380) | Cod sursa (job #3123159) | Cod sursa (job #3233060) | Cod sursa (job #2944812)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1000;
ifstream fin( "maxflow.in" );
ofstream fout( "maxflow.out" );
vector <int> edges[NMAX+1];
int capacity[NMAX+1][NMAX+1];
int source, dest;
int parent[NMAX+1];
int n, new_flow;
int delta;
void dfs( int node, int flow ) {
if( node == dest )
new_flow = flow;
for( auto it: edges[node] ) {
if( !parent[it] && capacity[node][it] >= delta ) {
parent[it] = node;
dfs( it, min( flow, capacity[node][it] ) );
}
}
}
int main() {
int m, a, b, c, node, flow, i, maxi, p2;
fin >> n >> m;
maxi = 0;
for( i = 0; i < m; i++ ) {
fin >> a >> b >> c;
maxi = max( maxi, c );
capacity[a][b] = c;
edges[a].push_back( b );
edges[b].push_back( a );
}
p2 = 1;
while( p2 * 2 <= maxi )
p2 *= 2;
delta = p2;
source = 1;
dest = n;
parent[source] = -1;
dfs( source, 1e9 );
flow = 0;
while( delta ) {
if( parent[dest] ) {
node = dest;
while( node != source ) {
capacity[parent[node]][node] -= new_flow;
capacity[node][parent[node]] += new_flow;
node = parent[node];
}
flow += new_flow;
for( i = 1; i <= n; i++ )
parent[i] = 0;
parent[source] = -1;
}
else
delta /= 2;
dfs( source, 1e9 );
}
fout << flow;
return 0;
}