Cod sursa(job #2965863)

Utilizator cosminnnnnnnaDuca Cosmina cosminnnnnnna Data 16 ianuarie 2023 13:50:07
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int nrNoduri, nrMuchii;
vector<int> parinte;
vector<vector<int>> capacitate, graf;
int sursa, destinatie;


bool bfs()
{
    vector<int> vizitat(nrNoduri + 1);
    queue<int> q;

    q.push(sursa);

    vizitat[sursa] = 1;
    parinte[sursa] = -1;

    while(!q.empty())
    {
        int u = q.front();
        q.pop();

        for (auto v: graf[u])
        {
            if (vizitat[v] == 0 && capacitate[u][v] != 0)
            {
                parinte[v] = u;

                if (v == destinatie)
                    return true;

                vizitat[v] = 1;
                q.push(v);
            }
        }
    }

    return false;
}


int EdmondsKarp()
{
    int fluxMax = 0;

    //cat inca exista un drum neviz
    while(bfs())
    {
        int nod1, nod2;
        nod2 = destinatie;

        int capDrum = INT_MAX;

        //parcurgere drum pentru a cauta capacitatea minima
        while(nod2 != sursa)
        {
            nod1 = parinte[nod2];

            if(capacitate[nod1][nod2] < capDrum)
                capDrum = capacitate[nod1][nod2];

            nod2 = parinte[nod2];
        }

        nod2 = destinatie;

        //parcurgere drum pt a actualiza capacitatile muchiilor
        while(nod2 != sursa)
        {
            nod1 = parinte[nod2];

            capacitate[nod1][nod2] -= capDrum; // cap muchiei din graful initial scade
            capacitate[nod2][nod1] += capDrum; // cap muchiei inverse creste

            nod2 = parinte[nod2];
        }

        fluxMax = fluxMax + capDrum;
    }


    return fluxMax;
}


int main() {

    fin >> nrNoduri >> nrMuchii;

    sursa = 1;
    destinatie = nrNoduri;

    parinte.resize(nrNoduri + 1);
    capacitate.resize(nrNoduri + 1, vector<int>(nrNoduri + 1));
    graf.resize(nrNoduri + 1);

    int nod1, nod2, cap;

    for (int i = 1; i <= nrMuchii; i++)
    {
        fin >> nod1 >> nod2 >> cap;

        graf[nod1].push_back(nod2);
        graf[nod2].push_back(nod1);

        capacitate[nod1][nod2] = cap;
    }

    fout << EdmondsKarp();

    return 0;
}