Cod sursa(job #2810394)

Utilizator andreea.ioanaSora Andreea-Ioana andreea.ioana Data 29 noiembrie 2021 13:18:44
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <queue>
#include <fstream>
#define N 1002
using namespace std;

int n, m, st, dr, cost;

bool bfsFlux(int tata[N], int grafRezidual[N][N])
{
    bool vizitat[N] = {false};
    queue <int> coada;
    coada.push(1);
    vizitat[1] = true;
    tata[1] = -1;
    while(!coada.empty())
    {
        int nod_curent = coada.front();
        for (int i = 1; i <= n; i++)
           if (vizitat[i] == false && grafRezidual[nod_curent][i] > 0)
           {
               if (i == n)
               {
                   tata[i] = nod_curent;
                   return true;
               }
               coada.push(i);
               tata[i] = nod_curent;
               vizitat[i] = true;
            }
        coada.pop();
    }
    return false;
}

int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int matriceFlux[N][N], tata[N], grafRezidual[N][N], fluxul_maxim = 0, flux_curent, tata_curent;
    fin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        fin >> st >> dr >> cost;
        matriceFlux[st][dr] = cost;
    }
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            grafRezidual[i][j] = matriceFlux[i][j];
    while (bfsFlux(tata, grafRezidual) == true)
    {
        flux_curent = INT_MAX;
        for (int v = n; v != 1; v = tata[v])
        {
            tata_curent = tata[v];
            flux_curent = min(flux_curent, grafRezidual[tata_curent][v]);
        }
        for (int v = n; v != 1; v = tata[v])
        {
            tata_curent = tata[v];
            grafRezidual[v][tata_curent] += flux_curent;
            grafRezidual[tata_curent][v] -= flux_curent;
        }
        fluxul_maxim += flux_curent;
    }
    fout << fluxul_maxim;
    fin.close();
    fout.close();
    return 0;
}