Pagini recente » Cod sursa (job #531495) | Cod sursa (job #387942) | Cod sursa (job #1234001) | Cod sursa (job #1394788) | Cod sursa (job #3281511)
//edmonds karp cu capacity scaling si lista de adiacenta poate merge
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
constexpr int LIM = 1005;
int N, M, s, t, u, v, cap[LIM][LIM], p[LIM], scale;
vector<int> adj[LIM];
bool find_augmenting_path() {
fill_n(p + 1, N, 0);
queue<int> q({ s });
p[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i : adj[u])
if (!p[i] && cap[u][i] >= scale) {
q.push(i);
p[i] = u;
if (i == t) return true;
}
}
return false;
}
int main() {
fin >> N >> M;
for (int i = 1; i <= M; ++i) {
fin >> u >> v;
fin >> cap[u][v];
adj[u].push_back(v);
adj[v].push_back(u);
}
s = 1, t = N;
long long max_flow = 0;
for (scale = (1 << 20); scale; scale >>= 1) {
while (find_augmenting_path()) {
int flow = 2e9;
for (u = t; u != s; u = p[u])
flow = min(flow, cap[p[u]][u]);
for (u = t; u != s; u = p[u]) {
cap[p[u]][u] -= flow;
cap[u][p[u]] += flow;
}
max_flow += flow;
}
}
fout << max_flow;
fin.close();
fout.close();
return 0;
}