Cod sursa(job #2694659)

Utilizator ddeliaioanaaDumitrescu Delia Ioana ddeliaioanaa Data 10 ianuarie 2021 12:29:50
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <bits/stdc++.h>
std::ifstream fin("maxflow.in");
std::ofstream fout ("maxflow.out");

const int INF = 1e9;
int rGrph[1001][1001];
int n, m;
std::vector<int> parent(1001, 0);
std::vector<int> nei[1001];

void bfs(){ //nodul 1 sursa nodul n destinatie
    int i, node;
    std::queue<int> q;
    for(i = 1; i <= n; ++i)
        parent[i] = 0;

    q.push(1);
    parent[1] = -1;

    while(!q.empty() && !parent[n]){
        node = q.front(); q.pop();
        for(auto next_node: nei[node]){
            if(rGrph[node][next_node] > 0 && parent[next_node] == 0){
                //mai putem pompa flux si next_node n a fost vizitat inca
                parent[next_node] = node;
                q.push(next_node);
            }
        }
    }
}

int FordFulkerson(){
    int max_flow = 0;
    while(true){
        bfs();
        //daca n am mai gasit alt drum afisam rezultatul
        if(parent[n] == 0)
            return max_flow;
        else { //altfel cautam fluxul maxim
            int node;
            for(auto next_node: nei[n]){
                node = n;
                parent[n] = next_node;
                if(parent[next_node] > 0){
                    int path_flow = INF;
                    //cautam fluxul maxim pe drumul gasit de bfs
                    while(parent[node] != -1){
                        path_flow = std::min(path_flow, rGrph[parent[node]][node]);
                        node = parent[node];
                    }
                    //updatam capacitatile reziduale si "intoarcem" muchiile
                    node = n;
                    while(parent[node] != -1){
                        rGrph[parent[node]][node] -= path_flow;
                        rGrph[node][parent[node]] += path_flow;
                        node = parent[node];
                    }
                    max_flow += path_flow;
                }
            }
        }
    }
}

int main()
{
    int x, y, cap, i;
    fin >> n >> m;
    for(i = 0; i < m ; ++i){
        fin >> x >> y >> cap;
        nei[x].push_back(y);
        nei[y].push_back(x);
        rGrph[x][y] = cap;
    }

    fout << FordFulkerson();
    return 0;
}