Cod sursa(job #2960282)

Utilizator Marius_TillingerTillinger Marius Marius_Tillinger Data 3 ianuarie 2023 22:44:13
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n,m;

vector<vector <int>> adjacency;
vector<bool> visited;
vector<int> parent;
queue<int> q;

vector<vector<int>> residual;

int source, sink;

int bfs (int node) {
    fill(visited.begin(), visited.end(), 0);
    visited[node] = 1;

    q.push(node);

    while (!q.empty()) {
        int currentNode = q.front(); 
        q.pop();

        for (auto i:adjacency[currentNode]) {
            if (!visited[i] && i!=n && residual[currentNode][i]>0) {
                visited[i] = 1;
                q.push(i);
                parent[i] = currentNode;
            }
        }
    }

    int max_flow_possible = 0;

    for (auto i : adjacency[n]) {
        if (!visited[i]) continue;

        int flow_min = residual[i][n];
        int aux_i = i;

        while (aux_i != 1) {
            flow_min = min(flow_min, residual[parent[aux_i]][aux_i]);
            aux_i = parent[aux_i];
        }

        residual[n][i] += flow_min;
        residual[i][n] -= flow_min;

        aux_i = i;

        while (aux_i != 1) {
            residual[aux_i][parent[aux_i]] += flow_min;
            residual[parent[aux_i]][aux_i] -= flow_min;
            aux_i = parent[aux_i];
        }

        max_flow_possible += flow_min;
    }

    return max_flow_possible;
}

int max_flow_getter() {
    int total_max_flow = 0;
    int augment_path = bfs(source);

    while (augment_path) {
        total_max_flow += augment_path;
        augment_path = bfs(source);
    }

    return total_max_flow;
}

int main () {

    fin >> n >> m;

    adjacency.resize(n+1);
    visited.resize(n+1,0);
    residual.resize(n+1, vector<int>(n+1, 0));
    parent.resize(n+1, -1);

    source = 1;
    sink = n;

    for (int i=0; i<m; i++) {

        int x,y,z;

        fin >> x >> y >> z;
        adjacency[x].push_back(y);
        adjacency[y].push_back(x);
        residual[x][y] += z;
    }

    fout << max_flow_getter();

    return 0;
}