Pagini recente » Cod sursa (job #78601) | Cod sursa (job #2385652) | Cod sursa (job #1753978) | Cod sursa (job #361511) | Cod sursa (job #2554396)
#include <bits/stdc++.h>
#define pii pair <int, int>
#define x first
#define y second
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct Edge {
int to, cap;
};
vector <Edge> edgs;
vector <int> g[1001];
int n, m;
bool f[1001];
pii tata[1001];
inline bool BFS() {
queue <int> q;
memset(f, 0, sizeof(f));
f[1] = true;
q.push(1);
while (!q.empty()) {
int nod = q.front();
q.pop();
if (nod == n)
continue;
for (auto i : g[nod]) {
if (edgs[i].cap > 0 && !f[edgs[i].to]) {
q.push(edgs[i].to);
f[edgs[i].to] = true;
tata[edgs[i].to] = {nod, i};
}
}
}
return f[n];
}
int main() {
int u, v, c;
in >> n >> m;
edgs.reserve((m << 1));
for (int i = 1; i <= m; ++i) {
in >> u >> v >> c;
g[u].push_back(edgs.size());
edgs.push_back({v, c});
g[v].push_back(edgs.size());
edgs.push_back({u, 0});
}
int rez = 0;
while (BFS()) {
for (auto i : g[n]) {
int minc = edgs[i ^ 1].cap, fiu = edgs[i].to;
if (!f[fiu])
continue;
for (int nod = fiu; nod != 1 && minc > 0; nod = tata[nod].x)
minc = min(minc, edgs[tata[nod].y].cap);
if (minc <= 0)
continue;
edgs[i].cap += minc;
edgs[i ^ 1].cap -= minc;
for (int nod = fiu; nod != 1; nod = tata[nod].x) {
edgs[tata[nod].y ^ 1].cap += minc;
edgs[tata[nod].y].cap -= minc;
}
rez += minc;
}
}
return out << rez, 0;
}