Cod sursa(job #2386726)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 23 martie 2019 16:27:54
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>
#define maxn 1000
#define maxm 5000
#define inf INT_MAX/2-1

using namespace std;

vector <int> g[maxn+5];
vector <int> way;
int _cap[maxn+5][maxn+5], _flx[maxn+5][maxn+5];
bool viz[maxn+5];
int n, m, flag;

void dfs ( int nod )
{
  int i, sz = g[nod].size(), nn;
  viz[nod] = 1;
  way.push_back (nod);
  if ( nod == n - 1 ) { flag = 0; return; }
  for ( i = 0; i < sz && flag; i++ )
  {
    nn = g[nod][i];
    if ( viz[nn] == 0 && _cap[nod][nn] > _flx[nod][nn] ) dfs (nn);
  }
  if ( flag == 1 ) way.pop_back();
}

int main ()
{
  ifstream fin ( "maxflow.in" );
  ofstream fout ( "maxflow.out" );

  fin >> n >> m;

  int i, a, b, c, sz, delta, ans = 0;
  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c; a--; b--;
    g[a].push_back (b); _cap[a][b] = c;
    g[b].push_back (a); _cap[b][a] = 0;
  }

  flag = 1; dfs (0);
  while ( flag == 0 )
  {
    sz = way.size(); delta = inf;
    for ( i = 0; i < sz-1; i++ ) delta = min (delta, _cap[way[i]][way[i+1]] - _flx[way[i]][way[i+1]]);
    for ( i = 0; i < sz-1; i++ ) _flx[way[i]][way[i+1]] += delta, _flx[way[i+1]][way[i]] -= delta;
    for ( i = 0; i < n; i++ ) viz[i] = 0;
    way.clear(); flag = 1; dfs (0);
  }
  sz = g[0].size();
  for ( i = 0; i < sz; i++ ) ans += _flx[0][g[0][i]];
  fout << ans;

  fin.close ();
  fout.close ();

  return 0;
}