Cod sursa(job #2907576)

Utilizator bluestorm57Vasile T bluestorm57 Data 30 mai 2022 19:55:30
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e4 + 5;
const int inf = 1e9;
vector < int > v[NMAX];
int n,m,F[NMAX][NMAX], c[NMAX][NMAX], parent[NMAX], viz[NMAX];
deque < int > q;

bool BF(){
    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(!viz[nxt] && c[node][nxt] != F[node][nxt]){
                viz[nxt] = 1;
                q.push_back(nxt);
                parent[nxt] = node;
            }
    }
    return viz[n];
}

int main(){
    int i,j,x,y,z;
    f >> n >> m;
    for(i = 1 ; 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 nxt: v[n]){
            if(F[nxt][n] == c[nxt][n] || !viz[nxt]) continue;

            int mflow = inf;

            parent[n] = nxt;

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

            if(mflow == 0) continue;

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

            flow += mflow;
        }

    }while(BF());

    g << flow;

    return 0;
}