Cod sursa(job #2907215)

Utilizator bluestorm57Vasile T bluestorm57 Data 29 mai 2022 12:47:18
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int NMAX = 1005;
const int inf = 2e9;
int n,m;
int c[NMAX][NMAX], F[NMAX][NMAX], parent[NMAX];
bool viz[NMAX];
vector < int > v[NMAX];
deque < int > q;

int BFS(){
    int node;
    memset(viz, 0, sizeof(viz));
    q.push_back(1);
    viz[1] = 1;
    while(!q.empty()){
        node = q.front();
        q.pop_front();

        if(node == n) continue;

        for(auto &nxt: v[node]){
            if(c[node][nxt] == F[node][nxt] || viz[nxt]) continue;
            viz[nxt] = 1;
            q.push_back(nxt);
            parent[nxt] = node;
        }
    }
    return viz[n];
}

int main(){
    int x, y, z, fmin, node;
    f >> n >> m;
    for(int i = 0 ; i < m ; i++){

        f >> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] += z;
    }

    int flow = 0;
    do{
        for(auto &it : v[n]){
            if(F[it][n] == c[it][n] || !viz[it])  continue;

            parent[n] = it;
            fmin = inf;

            for(node = n ; node != 1 ; node = parent[node])
                fmin = min(fmin, c[parent[node]][node] - F[parent[node]][node]);

            if(fmin == 0) continue;

            for(node = n ; node != 1 ; node = parent[node]){
                F[parent[node]][node] += fmin;
                F[node][parent[node]] -= fmin;
            }

            flow += fmin;
        }
    }while(BFS());

    g << flow;


    return 0;
}