Pagini recente » Cod sursa (job #2950807) | Cod sursa (job #1757843) | Cod sursa (job #3243225) | Cod sursa (job #1403564) | Cod sursa (job #1824494)
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#define f first
#define s second
#define pii pair <int, int>
using namespace std;
int n, m;
vector <int> v[1024], lst;
int f[1024][1024], c[1024][1024], t[1024];
queue <int> q;
inline void del ()
{
vector <int> change;
change.swap (lst);
}
inline bool bfs ()
{
q.push (1);
t[1] = -1;
bool OK = false;
for (; !q.empty (); q.pop ())
{
int nod = q.front ();
for (auto &it : v[nod])
{
if (it == n)
{
if (c[nod][it] > f[nod][it])
OK = true,
lst.push_back (nod);
continue;
}
if (!t[it] && c[nod][it] > f[nod][it])
t[it] = nod,
q.push (it);
}
}
return OK;
}
int main ()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf ("%d %d", &n, &m);
for (int i = 1; i <= m; ++i)
{
int x, y, cost;
scanf ("%d %d %d", &x, &y, &cost);
if (!c[x][y]) v[x].push_back (y);
c[x][y] += cost;
if (!c[y][x]) v[y].push_back (x);
}
int flux = 0;
for (; bfs ();)
{
for (auto &it : v[n])
{
int nod = it, mi = 2000000000;
for (; t[nod] > 0; nod = t[nod])
mi = min (mi, c[t[nod]][nod] - f[t[nod]][nod]);
flux += mi;
nod = it;
for (; t[nod] != -1; nod = t[nod])
f[t[nod]][nod] += mi,
f[nod][t[nod]] -= mi;
}
for (int i = 1; i <= n; ++i)
t[i] = 0;
del ();
}
printf ("%d\n", flux);
return 0;
}