Cod sursa(job #2860843)

Utilizator qweryclujRadu Alexandru qwerycluj Data 3 martie 2022 09:58:50
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

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

int n, m;
struct edge
{
    short int tata;
    short int nod;
    int c;
    int f;
};

vector<edge> graf[1005];
bool viz[1005];
std::vector<edge>::iterator tata[1005];

bool BFS()
{
    /// sursa e 1
    /// final e n
    queue<std::vector<edge>::iterator> que;

    memset(viz, false, 1004);
    viz[1] = true;

    for(std::vector<edge>::iterator i = graf[1].begin(); i < graf[1].end(); i++)
    {
        if(i->f < i->c)
        {
            que.push(i);
        }
    }

    while(!que.empty())
    {
        std::vector<edge>::iterator act;
        act = que.front();
        que.pop();
        tata[act->nod] = act;
        if(act->nod == n)
        {
            return true;
        }
        for(std::vector<edge>::iterator i = graf[act->nod].begin(); i < graf[act->nod].end(); i++)
        {
            if(!viz[i->nod] && i->f < i->c)
            {
                /// il vizitam
                viz[i->nod] = true;
                que.push(i);
            }
        }
    }

    return false;
}

int main()
{
    fin >> n;
    fin >> m;
    edge cache;
    cache.f = 0;
    int x, y ,z;
    for(int i = 0; i < m; i++)
    {
        fin >> x >> y >> z;
        cache.tata = x;
        cache.c = z;
        cache.nod = y;
        graf[x].push_back(cache);
    }

    int maxflow = 0;
    while(BFS())
    {
        std::vector<edge>::iterator act;
        act = tata[n];
        int minim = 2e9;
        if(act->c - act->f < minim)
        {
            minim = act->c - act->f;
        }
        while(act->tata != 1)
        {
            act = tata[act->tata];
            if(act->c - act->f < minim)
            {
                minim = act->c - act->f;
            }
        }
        maxflow += minim;

        act = tata[n];
        act->f += minim;
        while(act->tata != 1)
        {
            act = tata[act->tata];
            act->f += minim;
        }
    }

    fout << maxflow;

    return 0;
}