Cod sursa(job #2693608)

Utilizator buhaidarius@gmail.comBuhai Darius [email protected] Data 6 ianuarie 2021 15:41:56
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define NMAX 1001
#define INF 110002

using namespace std;

int n, m;
int residual[NMAX][NMAX];
vector<vector<int>> v;
vector<int> par;

bool bfs(){
    queue<int> q;
    for(int i=1;i<=n;++i)
        par[i] = 0;
    q.push(1);
    par[1] = -1;
    while(!q.empty() && !par[n]){
        int curr = q.front();
        q.pop();
        for(auto &node: v[curr])
            if(residual[curr][node] && !par[node]){
                par[node] = curr;
                q.push(node);
            }
    }
    return par[n] != 0;
}

int edmonds_karp(){
    int max_flow = 0;
    while(bfs())
        for(auto &node: v[n]){
            int curr = n;
            par[curr] = node;
            if(par[node]>0){
                int flow = INF;
                while(par[curr] != -1){
                    flow = min(flow, residual[par[curr]][curr]);
                    curr = par[curr];
                }
                curr = n;
                while(par[curr] != -1){
                    residual[par[curr]][curr] -= flow;
                    residual[curr][par[curr]] += flow;
                    curr = par[curr];
                }
                max_flow += flow;
            }
        }
    return max_flow;
}

int main() {
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    fin>>n>>m;
    int x, y, c;
    v.resize(n+1);
    par.resize(n+1, 0);
    for(int i=0;i<m;++i){
        fin>>x>>y>>c;
        residual[x][y] = c;
        v[x].emplace_back(y);
        v[y].emplace_back(x);
    }
    fout<<edmonds_karp();
    return 0;
}