Cod sursa(job #2760092)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 22 iunie 2021 21:09:19
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define INF 100000000
using namespace std;
int coada[1005], st, dr, flux[1005][1005], capacity[1005][1005], dad[1005], n, m, i, x, y, z, flux_maximal;
bool seen[1005];
vector <int> v[1005];
bool BFS()
{
    st = 1;
    dr = 1;
    coada[1] = 1;
    memset(seen, false, sizeof(seen));
    while(st <= dr)
    {
        int aux = coada[st];
        st ++;
        for(int i = 0; i < v[aux].size(); i ++)
        {
            int aux1 = v[aux][i];
            if(seen[aux1] == true || flux[aux][aux1] == capacity[aux][aux1])continue;
            seen[i] = true;
            dad[aux1] = aux;
            coada[++ dr] = aux1;
            if(aux1 == n)return true;
        }
    }
    return false;
}
int aux, minn;
int main()
{
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    f >> n >> m;
    for(i = 1; i <= m; i ++)
    {
        f >> x >> y >> z;
        capacity[x][y] = z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    flux_maximal = 0;
    while(true)
    {
        bool ok = BFS();
        if(ok == false)break;
        aux = n;
        minn = INF;
        while(aux != 1)
        {
            minn = min(minn, capacity[dad[aux]][aux] - flux[dad[aux]][aux]);
            aux = dad[aux];
        }
        aux = n;
        while(aux != 1)
        {
            flux[dad[aux]][aux] += minn;
            flux[aux][dad[aux]] -= minn;
            aux = dad[aux];
        }
        flux_maximal += minn;
    }
    g << flux_maximal;
    return 0;
}