Cod sursa(job #2760098)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 22 iunie 2021 21:29:57
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 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 ++;
        if(aux == n)continue;
        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[aux1] = true;
            dad[aux1] = aux;
            coada[++ dr] = aux1;
        }
    }
    return seen[n];
}
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);
    }
    while(BFS())
    {
        for(int i = 0; i < v[n].size(); i ++)
        {
            int aux1 = v[n][i];
            if(flux[aux1][n] == capacity[aux1][n] || seen[aux1] == false)continue;
            minn = INF;
            dad[n] = aux1;
            aux = n;
            while(aux != 1)
            {
                minn = min(minn, capacity[dad[aux]][aux] - flux[dad[aux]][aux]);
                aux = dad[aux];
            }
            if(minn == 0)continue;
            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;
}