Cod sursa(job #2385061)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 21 martie 2019 16:03:27
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 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];
map<pii,int> _cap; /// capacitatea unei muchii
map<pii,int> _flx; /// 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, j, 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, j, z, 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);
    _cap[{a,b}] = c; _cap[{b,a}] = 0; /// <- mch reziduala
  }

  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;
}