Cod sursa(job #2944812)

Utilizator vladburacBurac Vlad vladburac Data 22 noiembrie 2022 23:22:20
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#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;
}