Загрузка данных


#include <iostream>
#include <chrono>

using namespace std;
using namespace std::chrono;

const int V = 6, s = 0, t = 5, INF = 1e9;
int capacity[V][V] = {
    {0,10,5,0,0,0}, {0,0,0,10,0,0}, {0,0,0,5,10,0},
    {0,0,0,0,0,10}, {0,0,0,5,0,10}, {0,0,0,0,0,0}
};

int flow[V][V], residual[V][V], parent[V];
bool visited[V];

bool FindPath(int u) {
    if (u == t) return true;
    for (int v = 0; v < V; v++) {
        if (!visited[v] && residual[u][v] > 0) {
            visited[v] = true;
            parent[v] = u;
            if (FindPath(v)) return true;
        }
    }
    return false;
}

int FordFulkerson() {
    for (int u = 0; u < V; u++)
        for (int v = 0; v < V; v++) {
            flow[u][v] = 0;
            residual[u][v] = capacity[u][v];
        }

    int max_flow = 0;
    while (true) {
        fill(parent, parent + V, -1);
        fill(visited, visited + V, false);
        parent[s] = s;
        visited[s] = true;

        if (!FindPath(s)) break;

        int bottleneck = INF;
        for (int v = t; v != s; v = parent[v])
            bottleneck = min(bottleneck, residual[parent[v]][v]);

        for (int v = t; v != s; v = parent[v]) {
            int u = parent[v];
            flow[u][v] += bottleneck;
            flow[v][u] -= bottleneck;
            residual[u][v] = capacity[u][v] - flow[u][v];
            residual[v][u] = capacity[v][u] - flow[v][u];
        }
        max_flow += bottleneck;
    }
    return max_flow;
}

int main() {
    auto start = high_resolution_clock::now();

    cout << "Max flow: " << FordFulkerson() << "\n";

    double ms = duration<double, milli>(high_resolution_clock::now() - start).count();
    cout << "Time: " << ms << " ms\n";

    return 0;
}