Pagini recente » Cod sursa (job #500192) | Cod sursa (job #2178120) | Cod sursa (job #179101) | Cod sursa (job #158286) | Cod sursa (job #2440561)
#include <fstream>
#include <cassert>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int N = 1009;
vector < int > g[N];
int cap[N][N];
namespace FLUX {
int n, s, t;
int dq[N];
int dist[N];
int f[N][N];
bool bfs() {
memset(dist, 0, sizeof dist);
int st(0), dr(-1);
dq[++dr] = s;
dist[s] = 1;
while (st <= dr) {
int x = dq[st++];
if (x == t)
continue;
for (int i : g[x]) {
if (dist[i] == 0 && cap[x][i] - f[x][i] > 0) {
dist[i] = dist[x] + 1;
dq[++dr] = i;
}
}
}
return dist[t];
}
int dfs(int nod = s, int val = (int)2e9 + 7) {
if (nod == t)
return val;
int ans(0);
for (int i : g[nod]) {
if (cap[nod][i] - f[nod][i] > 0 && dist[i] == dist[nod] + 1) {
int x = dfs(i, min(val, cap[nod][i] - f[nod][i]));
f[nod][i] += x;
f[i][nod] -= x;
ans += x;
val -= x;
}
}
return ans;
}
int flux(const int &_n, const int &_s, const int &_t) {
n = _n;
s = _s;
t = _t;
int ans(0);
while (bfs()) {
ans += dfs();
}
return ans;
}
}
int main() {
int n, m, x, y, z;
cin >> n >> m;
while (m--) {
cin >> x >> y >> z;
cap[x][y] += z;
g[x].push_back(y);
g[y].push_back(x);
}
cout << FLUX::flux(n, 1, n);
return 0;
}