Cod sursa(job #2960300)

Utilizator mihneagherghelMihnea Gherghel-Butan mihneagherghel Data 3 ianuarie 2023 23:53:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m;
vector<vector<int>> listaAdiacenta;
vector < vector<int>> grafRezidual;
vector<bool> viz;
vector<int> tata;

//citire date+ construire lista adiacenta si grafd rezidual
void citire()
{
    fin >> n >> m;
    listaAdiacenta = vector<vector<int>>(n + 1, vector<int>());
    grafRezidual = vector<vector<int>>(n + 1, vector<int>(n + 1, 0));
    int a, b, capacitate;
    for (int i = 0; i < m; i++)
    {
        fin >> a >> b >> capacitate;
        listaAdiacenta[a].push_back(b);
        listaAdiacenta[b].push_back(a);
        grafRezidual[a][b] = capacitate;
    }
}
int bfs()
{
    // initializam vectorul de tati si vectorul de vizitati
    viz = vector<bool>(n + 1, false);
    tata = vector<int>(n + 1, true);
    queue<int> coada;

    // adaugam nodul de start in coada
    coada.push(1);
    viz[1] = true;

    // construire lant nesaturat care porneste din nodul 1 si ajunge intr-un nod vecin cu n
    while (!coada.empty())
    {
        int nod = coada.front();
        coada.pop();
        for (auto i : listaAdiacenta[nod])
        {
            if (viz[i] == 0 && grafRezidual[nod][i] > 0 && i != n)
            {
                viz[i] = true;
                coada.push(i);
                tata[i] = nod;
            }
        }
    }
    int flow = 0;
    // parcurg toti vecinii nodului n
    for (auto i : listaAdiacenta[n])
    {
        if (!viz[i])
            continue;
        int flowPartial = grafRezidual[i][n];
        int nod = i;
        // aflam capacitatea reziduala a lantului care contine nodurile i si destinatie
        while (nod != 1)
        {
            flowPartial = min(flowPartial, grafRezidual[tata[nod]][nod]);
            nod = tata[nod];
        }
        // actualizam graful rezidual
        grafRezidual[i][n] -= flowPartial;
        grafRezidual[n][i] += flowPartial;
        nod = i;
        while (nod != 1)
        {
            grafRezidual[tata[nod]][nod] -= flowPartial;
            grafRezidual[nod][tata[nod]] += flowPartial;
            nod = tata[nod];
        }
        flow += flowPartial;
    }
    return flow;
}
int main()
{
    citire();
    int maxFlow = 0;
    int flow = 0;
    while (flow=bfs())
    {
        maxFlow += flow;
    }
    fout << maxFlow;
}