Cod sursa(job #2695511)

Utilizator Vasilescu-LaurentiuVasilescu Laurentiu-Marian Vasilescu-Laurentiu Data 13 ianuarie 2021 15:30:10
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define oo (1 << 30)
#define MAX 1005
using namespace std;

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

int n, m, x ,y , COST, FLOW;
int cap[MAX][MAX], flux[MAX][MAX], vizitat[MAX], t[MAX];

vector < int > g[MAX];
deque < int > d;

int BFS(){
    int NOD;
    memset(vizitat, 0, sizeof(vizitat));
    vizitat[1] = 1;
    d.push_back(1);
    while(!d.empty()){
        NOD = d.back();
        d.pop_back();
        if(NOD == n)
            continue;
        for(int i = 0; i < g[NOD].size(); i++){
            int vec = g[NOD][i];
            if(vizitat[vec] || cap[NOD][vec] == flux[NOD][vec])
                continue;
            vizitat[vec] = 1;
            t[vec] = NOD;
            d.push_front(vec);
        }
    }

    return vizitat[n];
}

int main(){
    in>>n>>m;
    while(m--){
        in>>x>>y>>COST;
        cap[x][y] += COST;
        g[x].push_back(y);
        g[y].push_back(x);
    }

    for(FLOW = 0; BFS();)
    for(int i = 0; i < g[n].size(); i++){
        int NOD = g[n][i];
        if(flux[NOD][n] == cap[NOD][n] || !vizitat[NOD])
            continue;
        t[n] = NOD;
        int fluxmin = oo;
        for(NOD = n; NOD != 1; NOD = t[NOD])
            fluxmin = min(fluxmin, cap[t[NOD]][NOD] - flux[t[NOD]][NOD]);

        if(!fluxmin)
            continue;
        for(NOD = n; NOD != 1; NOD = t[NOD]){
            flux[t[NOD]][NOD] += fluxmin;
            flux[NOD][t[NOD]] -= fluxmin;
        }

        FLOW += fluxmin;
    }

    out<<FLOW;

}