Cod sursa(job #2755410)

Utilizator Username01Name Surname Username01 Data 27 mai 2021 10:14:45
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");
bool BFS(int** G, int V, int s, int d, int* parent) {
    bool* viz = new bool[V];
    for (int i = 0; i < V; i++)
        viz[i] = false;
    queue<int> Q;
    Q.push(s);
    parent[s] = -1;
    viz[s] = true;
    while (!Q.empty()) {
        int u = Q.front();
        Q.pop();
        for (int v = 0; v < V; v++) {
            if (viz[v] == false && G[u][v] > 0)
            {
                Q.push(v);
                parent[v] = u;
                viz[v] = true;
            }
        }
    }
    if (viz[d] == true) {
        delete[] viz;
        return true;
    }
    delete[] viz;
    return false;
}

int Ford_Fulkerson(int** G, int& V, int s, int d) {
    int u, v;
    int** rG; // graf rezidual
    rG = new int* [V];
    for (int i = 0; i < V; i++)
        rG[i] = new int[V];

    for (u = 0; u < V; u++)
        for (v = 0; v < V; v++)
            rG[u][v] = G[u][v];

    //
    int* parent = new int[V];
    int max_flow = 0;
    while (BFS(rG, V, s, d, parent)) {
        int path_flow = INT_MAX;
        for (v = d; v != s; v = parent[v])
        {
            u = parent[v];
            path_flow = min(path_flow, rG[u][v]);
        }

        for (v = d; v != s; v = parent[v])
        {
            u = parent[v];
            rG[u][v] -= path_flow;
            rG[v][u] += path_flow;
        }
        max_flow += path_flow;
    }
    return max_flow;
}

int main() {
    int V, e, x, y, c, i, max_flow = 0;
    int** G;
    f >> V >> e;

    G = new int* [V];
    for (int i = 0; i < V; i++)
        G[i] = new int[V];

    for (i = 0; i < e; i++) {
        f >> x >> y >> c;
        G[x][y] = c;
    }
    max_flow = Ford_Fulkerson(G, V, 0, V-1);
    g << max_flow;
    return 0;
}