Pagini recente » Cod sursa (job #2409292) | Cod sursa (job #892165) | Cod sursa (job #1466221) | Cod sursa (job #2608815) | Cod sursa (job #2421980)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
using Graph = vector<vector<int>>;
bool Bfs(const Graph &g, int source, int dest, vector<int> &pred)
{
queue<int> q;
q.push(source);
vector<bool> visited(g.size(), false);
visited[source] = true;
while (!q.empty()) {
auto node = q.front();
q.pop();
for (size_t i = 0; i < g.size(); i += 1) {
if (g[node][i] > 0 && !visited[i]) {
visited[i] = true;
pred[i] = node;
q.push(i);
}
}
}
return visited[dest];
}
int FindMinCapacity(Graph &g, int node, int prev, const vector<int> &pred)
{
auto res = g[node][prev];
while (node != -1) {
res = min(res, g[node][prev]);
prev = node;
node = pred[node];
}
return res;
}
int Flow(Graph &g, int node, int prev, const vector<int> &pred)
{
auto capacity = FindMinCapacity(g, node, prev, pred);
if (capacity <= 0) {
return 0;
}
while (node != -1) {
g[node][prev] -= capacity;
g[prev][node] += capacity;
prev = node;
node = pred[node];
}
return capacity;
}
int FindMaxFlow(Graph &g, int source, int dest)
{
vector<int> pred(g.size(), -1);
int max_flow = 0;
while (Bfs(g, source, dest, pred)) {
for (size_t i = 0; i < g.size(); i += 1) {
if (g[i][dest] > 0) {
max_flow += Flow(g, i, dest, pred);
}
}
}
return max_flow;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int nodes, edges;
fin >> nodes >> edges;
Graph graph(nodes, vector<int>(nodes));
for (auto i = 0; i < edges; i += 1) {
int a, b, cap;
fin >> a >> b >> cap;
graph[a - 1][b - 1] = cap;
}
auto res = FindMaxFlow(graph, 0, nodes - 1);
fout << res << "\n";
return 0;
}