Cod sursa(job #2616526)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 18 mai 2020 19:33:11
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <time.h>

const int MAXN = 1002 + 1;

using namespace std;

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

int flux[MAXN][MAXN],capacitate[MAXN][MAXN],pred[MAXN];
vector<int>graf[MAXN];
int n,m;

int main()
{
    clock_t start = clock();
    in>>n>>m;
    for(int i = 1; i <= m; i++){
        int x,y,cap;
        in>>x>>y>>cap;
        graf[x].emplace_back(y);
        graf[y].emplace_back(x);
        capacitate[x][y] = cap;
    }
    int ans = 0;
    while(true){
        for(int i = 1; i <= n; i++)
            pred[i] = 0;
        queue<int>coada;
        coada.push(1);
        bool ajuns = false;
        while(!coada.empty() && !ajuns){
            int nod = coada.front();
            coada.pop();
            for(auto const &vecin : graf[nod]){
                if(!pred[vecin] && vecin != 1 && flux[nod][vecin] < capacitate[nod][vecin]){
                    pred[vecin] = nod;
                    coada.push(vecin);
                    if(vecin == n){
                        ajuns = true;
                        break;
                    }
                }
            }
        }
        if(pred[n] == 0)
            break;
        for(auto const &vecin : graf[n]){
            if(pred[vecin]){
                int minim = capacitate[vecin][n] - flux[vecin][n];
                int nod = vecin;
                while(pred[nod] != 0){
                    int inapoi = pred[nod];
                    minim = min(minim,capacitate[inapoi][nod] - flux[inapoi][nod]);
                    nod = pred[nod];
                }
                nod = vecin;
                while(pred[nod] != 0){
                    int inapoi = pred[nod];
                    flux[inapoi][nod] += minim;
                    flux[nod][inapoi] -= minim;
                    nod = pred[nod];
                }
                flux[vecin][n] += minim;
                flux[n][vecin] -= minim;
                ans += minim;
            }
        }
    }
    out<<ans<<"\n";
    //cout<<(double)(clock() - start) / CLOCKS_PER_SEC;
    return 0;
}