Cod sursa(job #2805955)

Utilizator lucriLuchian Cristian lucri Data 22 noiembrie 2021 10:05:36
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
#define inf 1000000000
#define nmax 1010
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m;
bool vizitat[nmax];
int c[nmax][nmax], f[nmax][nmax], pred[nmax];
vector <int> v[nmax];
void citire(){
    int x, y, cap;
    in >> n >> m;
     for(int i = 1; i <= m; i++){
        in >> x >> y >> cap;
        c[x][y] += cap;
        v[x].push_back(y);
        v[y].push_back(x);
    }
}
bool BF(){
    vector <int> q;
    memset(vizitat, 0, sizeof(vizitat));
    q.push_back(1);
    vizitat[1] = true;
     for(int i = 0; i < q.size(); i++){
        int nod = q[i];
         if(nod == n)  continue;
         for(int j = 0; j < v[nod].size(); j++){
            int urm = v[nod][j];
            if(c[nod][urm] == f[nod][urm] || vizitat[urm]) continue;
            vizitat[urm] = true;
            q.push_back(urm);
            pred[urm] = nod;
        }
    }
     return vizitat[n];
}
int detFlux(){
    int flux = 0, fluxMin;
    while(BF())
        for(int i = 0; i < v[n].size(); i++){
            int nod = v[n][i];
            if(!vizitat[nod] || f[nod][n] == c[nod][n]) continue;
             pred[n] = nod;
            fluxMin = inf;
             for(nod = n; nod != 1; nod = pred[nod])
                fluxMin = min(fluxMin, c[pred[nod]][nod] - f[pred[nod]][nod]);
             if(fluxMin == 0)  continue;
             for(nod = n; nod != 1; nod = pred[nod]){
                f[pred[nod]][nod] += fluxMin;
                f[nod][pred[nod]] -= fluxMin;
            }
             flux += fluxMin;
        }
     return flux;
}
 int main()
{
    citire();
    out << detFlux();
    return 0;
}