Pagini recente » Cod sursa (job #2482599) | Cod sursa (job #1507402) | Cod sursa (job #1114155) | Cod sursa (job #2943667) | Cod sursa (job #465150)
Cod sursa(job #465150)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
int n, m;
vector <int> v[1002];
int c[1002][1002], f[1002][1002];
int up[1002];
bool bfs ()
{
memset (up, -1, sizeof (up));
up[1] = 0;
int i, nod;
queue <int> q;
q.push (1);
while (!q.empty ())
{
nod = q.front ();
for (i = 0; i < v[nod].size (); i ++)
if (up[v[nod][i]] == -1 && c[nod][v[nod][i]] > f[nod][v[nod][i]])
{
up[v[nod][i]] = nod;
if (v[nod][i] == n)
return 1;
q.push (v[nod][i]);
}
q.pop ();
}
return 0;
}
int flux ()
{
int min, nod, sol = 0, i;
while (bfs ())
{
for (i = 1; i < n; i ++)
if (up[i] != -1 && c[i][n] > f[i][n])
{
nod = i;
min = c[i][n] - f[i][n];
while (up[nod])
{
if (c[up[nod]][nod] - f[up[nod]][nod] < min)
min = c[up[nod]][nod] - f[up[nod]][nod];
nod = up[nod];
}
if (!min)
continue;
f[i][n] += min;
f[n][i] -= min;
nod = i;
while (up[nod])
{
f[up[nod]][nod] += min;
f[nod][up[nod]] -= min;
nod = up[nod];
}
sol += min;
}
}
return sol;
}
int main ()
{
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf ("%d %d", &n, &m);
int i, x, y, cap;
for (i = 1; i <= m; i ++)
{
scanf ("%d %d %d", &x, &y, &cap);
c[x][y] += cap;
v[x].push_back (y);
v[y].push_back (x);
}
printf ("%d\n", flux ());
return 0;
}