Cod sursa(job #3299850)

Utilizator popescubogdanPopescu Bogdan popescubogdan Data 11 iunie 2025 01:17:22
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int capacitate[1024][1024]; ///capacitatea maxima dintre doua noduri

int flux[1024][1024]; ///fluxul dintre doua noduri

int prec[1024]; ///precursor pentru a retine drumul parcurs de la start la finish

vector<int> mat[1024]; ///matricea de adiacenta

int n,m;

bool bfs()
{
    bool f[1024]={0};

    queue<int>Q;
    Q.push(1);

    while(Q.empty()!=1)
    {
        int nod=Q.front();

        for(vector<int>::iterator it=mat[nod].begin() ; it!=mat[nod].end(); it++)
        {

            if (capacitate[nod][(*it)]==flux[nod][(*it)] || f[(*it)]==1) /// daca avem flux maxim intre noduri sau am trecut prin acest nod
                continue; /// nu mai trec

            f[(*it)]=1; /// imi notez ca am vizitat nodul
            prec[(*it)]=nod;
            Q.push((*it));

            if ((*it)==n) ///daca am ajuns in capat m am oprit
                return 1;
        }
        Q.pop();
    }

    return 0; ///nu am putut ajunge in capat
}

int main()
{
    int fluxmax=0,fmin,a,b,cap;

    cin>>n>>m;

    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>cap;
        capacitate[a][b]+=cap;
        mat[a].push_back(b);
        mat[b].push_back(a);
    }


    while(bfs()==1)
    {

        fmin = 2000000000;

        int i=n;
        while(i!=1)
        {
            fmin=min(fmin, capacitate[prec[i]][i]- flux[prec[i]][i]);
            i=prec[i];
        }
        i=n;
        while(i!=1)
        {
            flux[prec[i]][i]+=fmin;
            flux[i][prec[i]]-=fmin;
            i=prec[i];
        }
        fluxmax+=fmin;

    }

    cout<<fluxmax;
    return 0;
}