Cod sursa(job #3262519)

Utilizator rares89_Dumitriu Rares rares89_ Data 10 decembrie 2024 13:50:57
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m;
vector<vector<int>> C, G;
vector<int> parent;

bool bfs(int start, int end) {
    vector<bool> visited(n + 1, false);
    queue<int> Q;
    Q.push(start);
    visited[start] = true;

    while (!Q.empty()) {
        int node = Q.front();
        Q.pop();
        for (int neighbor : G[node]) {
            if (!visited[neighbor] && C[node][neighbor] > 0) {
                parent[neighbor] = node;
                visited[neighbor] = true;
                if (neighbor == end)
                    return true;
                Q.push(neighbor);
            }
        }
    }
    return false;
}

int eKarp(int start, int end) {
    int maxFlow = 0;
    while(bfs(start, end)) {
        int pathFlow = 2e9;
        for (int v = end; v != start; v = parent[v]) {
            int u = parent[v];
            pathFlow = min(pathFlow, C[u][v]);
        }
        for (int v = end; v != start; v = parent[v]) {
            int u = parent[v];
            C[u][v] -= pathFlow;
            C[v][u] += pathFlow;
        }
        maxFlow += pathFlow;
    }
    return maxFlow;
}

int main() {
    fin >> n >> m;
    parent.resize(n + 1);
    G.resize(n + 1);
    C.resize(n + 1, vector<int>(n + 1, 0));

    for(; m; --m) {
        int x, y, z;
        fin >> x >> y >> z;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] += z;
    }

    fout << eKarp(1, n) << "\n";
    return 0;
}