Cod sursa(job #2971882)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 28 ianuarie 2023 11:19:11
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <queue>
#include <map>
#include <vector>
const int NMAX=505;

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

void niv(int);
int dfs(int, int);

map< pair< int, int >, int > f;
vector <int> v[NMAX];
int lvl[NMAX];
bool de[NMAX];
int n, m, r;

int main()
{
    int i, x, y, z;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>z;
        v[x].push_back(y);
        f[{x, y}]=z;
        if(!f[{y, x}]) v[y].push_back(x);
    }

    niv(1);
    while(lvl[n])
    {
        x=1;
        while(x)
        {
            x=dfs(1, 1e9);
            r+=x;
        }
        niv(1);
    }
    fout<<r<<'\n';
    return 0;
}

void niv(int nod)
{
    int i;
    queue <int> q;
    for(i=1; i<=n; i++)
    {
        lvl[i]=0;
        de[i]=false;
    }
    lvl[nod]=1;
    q.push(nod);
    while(!q.empty())
    {
        nod=q.front();
        for(auto i:v[nod])
        {
            if(!lvl[i] && f[{nod, i}]>0)
            {
                lvl[i]=lvl[nod]+1;
                q.push(i);
            }
        }
        q.pop();
    }
}

int dfs(int nod, int mini)
{
    int x;
    if(nod==n) return mini;
    for(auto i:v[nod])
    {
        if(lvl[i]==lvl[nod]+1 && !de[i] && f[{nod, i}]>0)
        {
             x=dfs(i, min(mini, f[{nod, i}]));
             if(x)
             {
                 f[{nod, i}]-=x;
                 f[{i, nod}]+=x;
                 return x;
             }
             else de[i]=true;
        }
    }
    return 0;
}