Pagini recente » Cod sursa (job #2070138) | Cod sursa (job #594079) | Cod sursa (job #1419564) | Cod sursa (job #2302648) | Cod sursa (job #2385061)
#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;
}