Pagini recente » Cod sursa (job #2050619) | Cod sursa (job #2663357) | Cod sursa (job #2467530) | Cod sursa (job #2920737) | Cod sursa (job #3234095)
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
using pii = pair<int, int>;
const int lim = 1e3 + 5;
const int inf = 1e9 + 7;
struct node {
int id;
int nod;
int flow;
int capp;
};
vector<node> vec[lim];
int n, m, x, y, c;
pii bef[lim];
bool ok[lim];
int main() {
in >> n >> m;
for (int i = 1; i <= m; ++i) {
in >> x >> y >> c;
int vxs = vec[x].size();
int vys = vec[y].size();
vec[x].push_back((node){vys, y, 0, c});
vec[y].push_back((node){vxs, x, 0, 0});
}
int max_flow = 0;
int added_flow;
do {
for (int i = 1; i <= n; ++i) {
ok[i] = false;
bef[i] = make_pair(-1, -1);
}
added_flow = 0;
queue<int> q;
q.push(1);
ok[1] = true;
while (!q.empty()) {
int curr = q.front();
q.pop();
for (int i = 0; i < vec[curr].size(); ++i) {
node x = vec[curr][i];
if (ok[x.nod] or x.flow == x.capp) {
continue;
}
ok[x.nod] = true;
bef[x.nod] = make_pair(curr, i);
q.push(x.nod);
}
}
for (int i = 0; i < vec[n].size(); ++i) {
node pen = vec[n][i];
if (!(ok[pen.nod] and
vec[pen.nod][pen.id].flow < vec[pen.nod][pen.id].capp)) {
continue;
}
int min_diff =
vec[pen.nod][pen.id].capp - vec[pen.nod][pen.id].flow;
for (int unde = pen.nod; unde != 1; unde = bef[unde].first) {
min_diff = min(min_diff,
vec[bef[unde].first][bef[unde].second].capp -
vec[bef[unde].first][bef[unde].second].flow);
}
if (min_diff == 0) {
continue;
}
vec[pen.nod][pen.id].flow += min_diff;
vec[n][i].flow -= min_diff;
for (int unde = pen.nod; unde != 1; unde = bef[unde].first) {
vec[bef[unde].first][bef[unde].second].flow += min_diff;
vec[unde][vec[bef[unde].first][bef[unde].second].id].flow -=
min_diff;
}
added_flow += min_diff;
}
max_flow += added_flow;
} while (added_flow != 0);
out << max_flow << '\n';
return 0;
}