Cod sursa(job #2959671)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 2 ianuarie 2023 11:10:59
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include<iostream>
#include<cstring>
#include<bitset>
#include<vector>
#include<queue>
using namespace std;

#pragma GCC optimize("0fast")


const int NMAX = 1e3 + 1;

int flow[NMAX][NMAX],cap[NMAX][NMAX],minim,n;

vector<int> vecini[NMAX],t(NMAX);

int bfs()
{
    fill(t.begin(),t.begin() + n + 1,-1);
    queue<pair<int,int>> q;
    q.push({1,2e9});

    while(!q.empty())
        {
            int nod = q.front().first;
            int f   = q.front().second;
            q.pop();

            for(auto it : vecini[nod])
                {
                    if(t[it] != -1)
                        continue;

                    int rez = cap[nod][it] - flow[nod][it];
                    if(!rez) continue;

                    t[it] = nod;
                    if(it == n) return min(f,rez);
                    q.push({it,min(f,rez)});
                }
        }

    return 0;
}

void ffa()
{
    long long total = 0;
    int minim;
    while(minim = bfs())
        {
            total += 1LL * minim;
            int nod = n;
            while(nod != 1)
                {
                    flow[t[nod]][nod] += minim;
                    flow[nod][t[nod]] -= minim;
                    nod = t[nod];
                }
        }

    cout << total << endl;
    exit(0);
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int a,b,c,m; cin >> n >> m;
    while(m--)
        {
            cin >> a >> b >> c;
            cap[a][b] = c;
            vecini[a].push_back(b);
            vecini[b].push_back(a);
        }

    ///ford-fulkerson

    ffa();
}