Cod sursa(job #2937056)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 9 noiembrie 2022 19:49:11
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.49 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, ii, tt, i, x, y, c, flow[1005][1005], capacity[1005][1005], rez, dad[1005], curr, max_add_flow, level[1005];
vector <int> v[1005];
bool seen[1005];
bool BFS()
{
    memset(seen, false, sizeof(seen));
    seen[1] = true;
    queue <int> Q;
    Q.push(1);
    while(!Q.empty())
    {
        int aux = Q.front();
        Q.pop();
        for(int i = 0; i < v[aux].size(); i ++)
        {
            int aux1 = v[aux][i];
            if (level[aux1] == level[aux] + 1 && !seen[aux1] && flow[aux][aux1] < capacity[aux][aux1])
            {
                dad[aux1] = aux;
                seen[aux1] = true;
                Q.push(aux1);
                if (aux1 == n)
                    return true;
            }
        }
    }
    return false;
}
void build_levels()
{
    queue<int> Q;
    Q.push(1);
    level[1] = 1;
    memset(seen, 0, sizeof(seen));
    while(!Q.empty())
    {
        int aux = Q.front();
        Q.pop();
        for(int i = 0; i < v[aux].size(); i ++)
        {
            int aux1 = v[aux][i];
            if (!seen[aux1] && capacity[aux][aux1] > 0 && flow[aux][aux1] < capacity[aux][aux1])
            {
                level[aux1] = level[aux] + 1;
                seen[aux1] = true;
                Q.push(aux1);
                if (aux1 == n)
                    return;
            }
        }
    }
}
void read()
{
    f >> n >> m;
    for(i = 1; i <= m; i ++)
    {
        f >> x >> y >> c;

        v[x].push_back(y);
        v[y].push_back(x);

        capacity[x][y] = c;
    }
}
void solve()
{
    while(true)
    {
        build_levels();

        bool flag = true;
        while(BFS())
        {
            flag = false;
            curr = n;
            max_add_flow = 1e9;
            while(curr != 1)
            {
                max_add_flow = min(max_add_flow, capacity[dad[curr]][curr] - flow[dad[curr]][curr]);
                curr = dad[curr];
            }
            curr = n;
            while(curr != 1)
            {
                flow[dad[curr]][curr] += max_add_flow;
                flow[curr][dad[curr]] -= max_add_flow;
                curr = dad[curr];
            }
            rez += max_add_flow;
        }
        if(flag)
            break;
    }
}
void write()
{
    g << rez << "\n";
    f.close();
    g.close();
}
int main()
{
    //cin >> tt;
    tt = 1;
    for(ii = 1; ii <= tt; ii ++)
    {
        read();
        solve();
        write();
    }
    return 0;
}