Cod sursa(job #2849697)

Utilizator chriss_b_001Cristian Benghe chriss_b_001 Data 15 februarie 2022 15:52:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

const int NMAX = 1001,
          INF = 0x3f3f3f3f;

int N, M, S, D,
    C[NMAX][NMAX],
    F[NMAX][NMAX],
    T[NMAX];

vector<int> G[NMAX];

ifstream f("maxflow.in");
ofstream g("maxflow.out");

void citire()
{
    int x, y, z;
    f >> N >> M;
    while(M--)
    {
        f >> x >> y >> z;
        C[x][y] = z;
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

bool bfs()
{
    bool ok = 0;
    queue <int> Q;
    for(int i = 1; i <= N; i++)
        T[i] = 0;
    T[S] = -1;
    Q.push(S);
    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        for(int &it : G[nod])
            if(T[it] == 0 && C[nod][it] > F[nod][it]) ///Nu am folosit nodul si se mai poate pompa
            {
                if(it != D)
                {
                    T[it] = nod;
                    Q.push(it);
                }
                else ok = 1; ///Se poate ajunge la destinatie
            }
    }
    return ok;
}

int EdKaD()
{
    int nod, cmin, flux = 0;
    while(bfs()) ///cat timp mai exista un drum de ameliorare
        for(int &i : G[D])
            if(T[i] && C[i][D] > F[i][D])
            {
                T[D] = i;
                cmin = INF;  ///calculam minimul dintre capacitatile de pe drum
                for(nod = D; nod != S; nod = T[nod])
                {
                    cmin = min(cmin, C[T[nod]][nod] - F[T[nod]][nod]);
                }
                if(cmin <= 0) continue;
                flux += cmin;   ///adaugam minimul la flux
                for(nod = D; nod != S; nod = T[nod])
                {
                    F[T[nod]][nod] += cmin; ///adaugam minimul la fluxul de pe arcele de pe drum
                    F[nod][T[nod]] -= cmin; ///scadem minimul de pe arcele inverse
                }
            }
    return flux;
}


int main()
{
    citire();
    S = 1;
    D = N;
    g << EdKaD();
    return 0;
}