Cod sursa(job #2371529)

Utilizator WayronUrsu Ianis-Vlad Wayron Data 6 martie 2019 18:07:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;


vector<vector<int>> graph, capacity, flow;
vector<int> parent;

int n, m;

void read(){
    ifstream fin("maxflow.in");

    fin>>n>>m;

    graph.resize(n+1, vector<int>());
    capacity.resize(n+1, vector<int>(n+1, 0));
    flow.resize(n+1, vector<int>(n+1, 0));
    parent.resize(n+1);

    int x, y, c;
    for(int i=1; i<=m; i++){
        fin>>x>>y>>c;
        graph.at(x).push_back(y);
        graph.at(y).push_back(x);

        capacity.at(x).at(y) = c;
    }

}
bool bfs(){
    vector<bool> visited = vector<bool>(n+1, false);

    queue<int> Queue;

    Queue.push(1);

    while(!Queue.empty()){
        int node = Queue.front();
        visited.at(node) = true;
        Queue.pop();

        for(auto& neighbour:graph.at(node)){
            if(capacity.at(node).at(neighbour)==flow.at(node).at(neighbour)||visited.at(neighbour)) continue;

            parent.at(neighbour) = node;

            if(neighbour == n) return true;

            Queue.push(neighbour);
        }

    }

    return false;
}


int main()
{
    read();

    int maxFlow = 0, currentFlow;

    while(bfs()){
        currentFlow = INT_MAX;

        for(int i=n; i!=1; i = parent.at(i))
            currentFlow = min(currentFlow, capacity.at(parent.at(i)).at(i) - flow.at(parent.at(i)).at(i));

        for(int i=n; i!=1; i=parent.at(i)){
            flow.at(parent.at(i)).at(i) += currentFlow;
            flow.at(i).at(parent.at(i)) -= currentFlow;

        }

        maxFlow += currentFlow;
    }

    ofstream fout("maxflow.out");
    fout<<maxFlow;
}