Cod sursa(job #2887129)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 8 aprilie 2022 21:37:29
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream f ( "maxflow.in" );
ofstream g ( "maxflow.out" );
const int NMAX = 1001, INF = 0x3f3f3f3f;
int N, M, S, D,
    C[NMAX][NMAX],
    F[NMAX][NMAX],
    T[NMAX];
vector<int>G[NMAX];
void citire()
{
    int x, y;
    f >> N >> M;

    while ( M-- )
    {
        f >> x >> y;
        f >> C[x][y];
        G[x].pb ( y );
        G[y].pb ( x );
    }
}
bool bfs()
{
    queue <int> Q;

    for ( int i = 1; i <= N; i++ )
        T[i] = 0;

    T[S] = -1;
    Q.push ( S );
    bool ok = 0;

    while ( !Q.empty() )
    {
        int nod = Q.front();
        Q.pop();

        for ( int &i : G[nod] )
            if ( T[i] == 0 && C[nod][i] > F[nod][i] ) ///Nu am folosit nodul si se mai poate pompa
            {
                if ( i != D )
                {
                    T[i] = nod;
                    Q.push ( i );
                }
                else ok = 1;
            }
    }

    return ok;
}
int EdKaD()
{
    int flow = 0; ///fluxul
    int i, cmin;

    while ( bfs() ) ///cat timp mai exista un drum de ameliorare
        for ( int &nod : G[D] )
            if ( T[nod] && C[nod][D] > F[nod][D] )
            {
                T[D] = nod;
                cmin = INF; ///calculam minimul dintre capacitatile ramase de pe drum

                for ( i = D; i != S; i = T[i] )
                {
                    cmin = min ( cmin, C[T[i]][i] - F[T[i]][i] );
                }

                if ( cmin <= 0 )
                    continue;

                for ( i = D; i != S; i = T[i] )
                {
                    F[T[i]][i] += cmin; ///adaugam minimul la fluxul de pe arcele de pe drum
                    F[i][T[i]] -= cmin; ///scadem minimul de pe arcele inverse
                }

                flow += cmin;           ///adaugam minimul la flux
            }

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