Cod sursa(job #2939866)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 14 noiembrie 2022 12:05:04
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")

using namespace std;

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

const int INF = 2e9;
const int MAX_N = 1005;
int n, m, x, y, c, nod, minflow, flux;
int parent[MAX_N], cap[MAX_N][MAX_N], flow[MAX_N][MAX_N];
vector <int> v[MAX_N];

bool viz[MAX_N];
static inline bool find_path(){
    for(int i=1; i<=n; i++)
        viz[i] = false;

    queue <int> path;
    viz[1] = true;
    parent[1] = 0;
    path.push(1);

    int crt;
    while(!path.empty()){
        crt = path.front();
        path.pop();

        for(auto nxt : v[crt]){
            if(!viz[nxt] && flow[crt][nxt] < cap[crt][nxt]){
                viz[nxt] = true;
                parent[nxt] = crt;
                path.push(nxt);

                if(nxt == n)
                    return true;
            }
        }
    }
    return false;
}

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

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

    while(find_path())
        for(auto crt : v[n])
            if(viz[crt] && flow[crt][n] < cap[crt][n]){
                parent[n] = crt;

                minflow = INF;
                nod = n;
                while(parent[nod]){
                    minflow = min(minflow, cap[parent[nod]][nod] - flow[parent[nod]][nod]);
                    nod = parent[nod];
                }

                flux += minflow;
                nod = n;
                while(parent[nod]){
                    flow[parent[nod]][nod] += minflow;
                    flow[nod][parent[nod]] -= minflow;
                    nod = parent[nod];
                }
            }
    fout<<flux;
    return 0;
}