Pagini recente » Cod sursa (job #740912) | Cod sursa (job #2183246) | Cod sursa (job #1847932) | Cod sursa (job #2466699) | Cod sursa (job #3004446)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#define DIM 1005
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, c[DIM][DIM], t[DIM];
vector<int> edges[DIM];
queue<int> q;
bitset<DIM> v;
bool bfs() {
bool ok = 0;
v.reset();
v[1] = 1;
q.push(1);
while (!q.empty()) {
int node = q.front();
q.pop();
for (auto child: edges[node]) {
if (c[node][child] > 0 && !v[child]) {
q.push(child);
v[child] = 1;
t[child] = node;
if (child == n) {
ok = 1;
}
}
}
}
return ok;
}
int main() {
f >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, flux;
f >> x >> y >> flux;
edges[x].push_back(y);
edges[y].push_back(x);
c[x][y] = flux;
}
int flux = 0;
while (bfs()) {
for (auto node: edges[n]) {
if (c[node][n] && v[node]) {
int minim = c[node][n];
int p = node;
while (t[p]) {
minim = min(minim, c[t[p]][p]);
p = t[p];
}
flux += minim;
c[node][n] -= minim;
c[n][node] += minim;
p = node;
while (t[p]) {
c[t[p]][p] -= minim;
c[p][t[p]] += minim;
p = t[p];
}
}
}
}
g << flux;
return 0;
}