Pagini recente » Cod sursa (job #2604823) | Cod sursa (job #1819578) | Cod sursa (job #379773) | Cod sursa (job #3276215) | Cod sursa (job #2658102)
#include <iostream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
int n, m;
int dad[1010];
int capc[1010][1010], flux[1010][1010];
bool fr[1010];
vector <int> g[1010];
bool bfs()
{
for (int i = 1; i <= n; i++) fr[i] = false;
fr[1] = true;
queue <int> que;
que.push(1);
while (!que.empty())
{
int node = que.front(); que.pop();
if (node == n) continue;
for (auto x: g[node])
if (!fr[x] && capc[node][x] != flux[node][x]) {
dad[x] = node;
que.push(x); fr[x] = true;
}
}
return (fr[n]);
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, z;
cin >> x >> y >> z;
g[x].pb(y);
g[y].pb(x);
capc[x][y] += z;
}
int f_max = 0;
while (bfs())
{
for (auto x: g[n])
if (fr[x] && capc[x][n] != flux[x][n]) {
int f_min = 1e9; dad[n] = x;
for (int j = n; j > 1; j = dad[j])
f_min = min(f_min, capc[dad[j]][j] - flux[dad[j]][j]);
if (f_min == 0) continue;
for (int j = n; j > 1; j = dad[j]) {
flux[dad[j]][j] += f_min;
flux[j][dad[j]] -= f_min;
}
f_max += f_min;
}
}
cout << f_max;
return 0;
}