Cod sursa(job #2385063)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 21 martie 2019 16:15:15
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>
#define maxn 1000
#define maxm 5000
#define inf INT_MAX/2-1
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;

int n, m;
vector <int> g[maxn+5];
vector <int> way;
bool viz[maxn+5];
int _cap[maxn+5][maxn+5]; /// capacitatea unei muchii
int _flx[maxn+5][maxn+5]; /// fluxul unei muchii

void dfs ( int nod )
{
  way.push_back (nod);
  viz[nod] = 1;

  if ( nod == n - 1 )
  {
    int delta = inf, i, sz = way.size();
    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;
    }
  }
  else
  {
    int i, nn, sz = g[nod].size();
    for ( i = 0; i < sz; i++ )
    {
      nn = g[nod][i];
      if ( viz[nn] == 0 && _flx[nod][nn] < _cap[nod][nn] )
        dfs (nn);
    }

  }
  way.pop_back();
  viz[nod] = 0;
}

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

  fin >> n >> m;

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

  dfs (0);
  int ans = 0;
  for ( i = 0; i < g[0].size(); i++ ) ans += _flx[0][g[0][i]];
  fout << ans;

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

  return 0;
}