Pagini recente » Cod sursa (job #2257454) | Cod sursa (job #860344) | Cod sursa (job #44473) | Cod sursa (job #327201) | Cod sursa (job #3270700)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
void print(std::vector<std::vector<int> > &graf, std::vector<std::vector<int> > &capacitate, const int n) {
for (int i = 0; i < n; ++i) {
std::cout << i + 1 << ": ";
for (const auto &j: graf[i])
std::cout << "(" << j + 1 << "," << capacitate[i][j] << ") ";
std::cout << "\n";
}
std::cout << "\n";
}
int bfs(std::vector<std::vector<int> > &graf, std::vector<std::vector<int> > &capacitate,
std::vector<std::vector<int> > &flux, const int n) {
std::vector viz(n, false);
std::vector tata(n, -1);
std::queue<int> q;
constexpr int src = 0;
int dest = n - 1;
q.push(src);
viz[src] = true;
while (!q.empty()) {
const int i = q.front();
q.pop();
for (const auto &j: graf[i])
if (!viz[j])
if (capacitate[i][j] - flux[i][j] > 0) {
q.push(j);
viz[j] = true;
tata[j] = i;
}
}
if (!viz[dest])
return 0;
std::vector<int> drum;
while (dest != -1) {
drum.push_back(dest);
dest = tata[dest];
}
std::ranges::reverse(drum);
int capRezMin = 1e9;
for (int i = 0; i < static_cast<int>(drum.size()) - 1; ++i) {
const int u = drum[i];
const int v = drum[i + 1];
capRezMin = std::min(capRezMin, capacitate[u][v] - flux[u][v]);
}
for (int i = 0; i < static_cast<int>(drum.size()) - 1; ++i) {
const int u = drum[i];
const int v = drum[i + 1];
flux[u][v] += capRezMin;
flux[v][u] -= capRezMin;
}
return capRezMin;
}
void edmondsKarp() {
std::vector<std::vector<int> > graf;
std::vector<std::vector<int> > capacitate;
std::vector<std::vector<int> > flux;
int n, m;
int i, j, w;
std::ifstream file("maxflow.in");
file >> n >> m;
graf.resize(n);
capacitate.resize(n, std::vector(n, 0));
flux.resize(n, std::vector(n, 0));
while (m--) {
file >> i >> j >> w;
capacitate[i - 1][j - 1] = w;
graf[i - 1].push_back(j - 1);
graf[j - 1].push_back(i - 1);
}
file.close();
int fluxMaxim = 0;
while (const int f = bfs(graf, capacitate, flux, n))
fluxMaxim += f;
std::ofstream g("maxflow.out");
g<<fluxMaxim;
g.close();
}
int main() {
edmondsKarp();
return 0;
}