Cod sursa(job #3005188)

Utilizator Vali_nnnValentin Nimigean Vali_nnn Data 16 martie 2023 20:05:30
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>
#include <cstring>
#include <queue>
#include <climits>
using namespace std;
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
int viz[1005] , tata[1005] , n , m , i , cap[1005][1005]  , x ,  y , c;
vector <int> v[1005];

int bfs (int start , int stop)
{
    memset (viz , 0 ,sizeof (viz));
    memset (tata , 0 , sizeof (tata));
    queue < int > coada;
    coada.push (start);
    viz[start] = 1;
    tata[start] = -1;
    while (!coada.empty ())
    {
        int nod = coada.front ();
        coada.pop ();

        if (nod == stop)
            return true;

        for (int i = 0 ; i < v[nod].size () ; i++)
        {
            int vecin = v[nod][i];
            if (viz[vecin] == 0 && cap[nod][vecin] > 0)
            {
                tata[vecin] = nod;
                coada.push (vecin);
                viz[vecin] = 1;
            }
        }
    }
    return false;
}

int flux (int start , int stop)
{
    int max_flow = 0 , flow;
    while (bfs (start , stop))
    {
        for (int i = 0 ; i < v[n].size () ; i++)
        {
            int vecin = v[n][i];
            if (viz[vecin])
            {
                tata[n] = vecin;
                flow = INT_MAX;

                for (int j = n ; j != 1 ; j = tata[j])
                    flow = min (flow , cap[tata[j]][j]);

                    for (int j = n ; j != 1 ; j = tata[j])
                    {
                        cap[tata[j]][j] -= flow;
                        cap[j][tata[j]] += flow;
                    }
                    max_flow += flow;
            }
        }
    }
    return max_flow;
}

int main()
{
    f >> n >> m;
    for (int i = 1 ; i <= m ; i++)
    {
        f >> x >> y >> c;
        v[x].push_back (y);
        v[y].push_back (x);
        cap[x][y] = c;
    }

    g << flux (1 , n);
    return 0;
}