Cod sursa(job #2961132)

Utilizator maria10Cioclov Maria maria10 Data 5 ianuarie 2023 21:10:40
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("muzeu.in");
ofstream fout("muzeu.out");

queue<int> bfs;
vector<int> parent;
vector<vector<int>> lista, flow, cap;

int bottleneck(int i){
    int p = parent[i];
    if(p == -1) return 111000;
    return min(cap[p][i] -  flow[p][i], bottleneck(p));
}

void update(int b, int i){
    int p = parent[i];
    if(p == -1) return;
    flow[p][i] += b;
    flow[i][p] -= b;
    update(b, p);
}

int main(){
    int n, m, x, y, z;
    fin>>n>>m;
    lista.resize(n+1);
    flow.resize(n+1);
    cap.resize(n+1);
    for(int i=1;i<=n;i++) flow[i].resize(n+1), cap[i].resize(n+1);

    for(int i=1; i<=m; i++){
        fin>>x>>y>>z;
        lista[x].push_back(y);
        lista[y].push_back(x);
        cap[x][y] = z;
    }

    parent.resize(n+1);
    int b;

    while(true){
        bfs.push(1);
        parent[1] = -1;

        while(!bfs.empty()){
            x = bfs.front();
            bfs.pop();

            for(auto y: lista[x])
                if(parent[y] == 0  && flow[x][y] < cap[x][y]) {
                    parent[y] = x;
                    if(y == n) break;
                    bfs.push(y);

                }

        }

        if(parent[n] != 0){
            b = bottleneck(n);
            update(b, n);
            fill(parent.begin(), parent.end(), 0);
        }
        else break;
    }
    
    int F = 0;
    for(int i=1; i<=n; i++)
        F += flow[1][i];
    fout<<F;
}