Cod sursa(job #2814286)

Utilizator Theo_FurtunaTheodor-Florentin Furtuna Theo_Furtuna Data 7 decembrie 2021 21:19:38
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.3 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
    int noduri;
    int muchii;
    void bfs_flux(vector<vector<int>>adiacenta, vector<int> Fluxuri[10001], vector<int> &vizitat, vector<int> &coada, vector<int> &distanta)
    {
        int primul = 1, ultimul = 1;
        coada[primul] = 1;
        vizitat[1] = -1;
        distanta[1] = 10001;
        while (primul <= ultimul)
        {
            for (int i = 1; i <= noduri; i++)
                if (!vizitat[i] && adiacenta[coada[primul]][i] - Fluxuri[coada[primul]][i] > 0)
                {
                    vizitat[i] = coada[primul];
                    coada[++ultimul] = i;
                    if (distanta[coada[primul]] < adiacenta[coada[primul]][i] - Fluxuri[coada[primul]][i])
                        distanta[i] = distanta[coada[primul]];
                    else
                        distanta[i] = adiacenta[coada[primul]][i] - Fluxuri[coada[primul]][i];
                    if (i == noduri)
                        return ;
                }
            primul++;
        }
    }
int main()
{
	in >> noduri >> muchii;
    int x, y, cost;
    vector<vector<int>> adiacenta(noduri + 1, vector<int>(noduri + 1, 0));
    for (int i = 1; i <= muchii; i++)
    {
        in >> x >> y >> cost;
        adiacenta[x][y] = cost;
    }
    vector<int> Fluxuri[10001];
    vector<int> vizitat(noduri + 1, 0);
    vector<int> coada(noduri + 1, 0);
    vector<int> distanta(noduri + 1, 0);
    for (int i = 0; i < muchii; i++)
        Fluxuri[i].resize(noduri + 1);
    int minim, flux = 0;
    do
    {
        for (int i = 1; i <= noduri; i++)
        {
            distanta[i] = 0;
            vizitat[i] = 0;
            coada[i] = 0;
        }
        bfs_flux(adiacenta, Fluxuri, vizitat, coada, distanta);
        if (vizitat[noduri])
        {
            minim = 10001;
            x = noduri;
            y = vizitat[x];
            minim = distanta[noduri];
            while (y != -1)
            {
                Fluxuri[y][x] += minim;
                Fluxuri[x][y] -= minim;
                x = y;
                y = vizitat[x];
            }
            flux += minim;
        }
    }while(vizitat[noduri]);
    out << flux;
	return 0;
}