Cod sursa(job #2125104)

Utilizator Y0da1NUME JMECHER Y0da1 Data 7 februarie 2018 23:12:34
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define NMAX 1024

using namespace std;

const int INF = 2e9;

int N, M;
int cost[NMAX][NMAX];
int flux[NMAX][NMAX];
int vizitat[NMAX];
int precedent[NMAX];

vector <int> G [NMAX];
queue <int> Q;
void clear_q()
{
    while (!Q.empty())
        Q.pop();
    return;
}

int BEFEU ()
{
    clear_q();
    for(int i = 0; i < NMAX; ++i)
        vizitat[i] = 0;
    vizitat[1] = 1;
    Q.push(1);
    while(!Q.empty())
    {
        int nod = Q.front();
        Q.pop();
        for(int j = 0; j < G[nod].size(); ++j)
        {
            int vecin = G[nod][j];
            if(cost[nod][vecin] == flux[nod][vecin] || vizitat[vecin])
                continue;
            vizitat[vecin] = 1;
            precedent[vecin] = nod;
            Q.push(vecin);
            if(vecin == N)  ///am ajuns la sink
                return 1;
        }
    }
    return 0;
}

int main()
{
    ifstream in ("maxflow.in");
    ofstream out ("maxflow.out");
    in>>N>>M;

    int x, y, z, nod;
    int flow, fmin;

    for (int i = 1; i <= M; i++)
    {
        in>>x>>y>>z;
        cost[x][y] += z;
        G[x].push_back(y);  ///muchia in graful normal
        G[y].push_back(x);  ///muchia in graful rezidual
    }
    flow = 0;
    while(BEFEU())
    {
        //cout<<"1\n";
        fmin = INF;
        for (nod = N; nod != 1; nod = precedent[nod])
        {
            fmin = min(fmin, cost[precedent[nod]][nod] - flux[precedent[nod]][nod]);    ///gasim bottleneckul
            //cout<<fmin<<"\n";
        }
        for (nod = N; nod != 1; nod = precedent[nod])
        {
            flux[precedent[nod]][nod] += fmin;
            flux[nod][precedent[nod]] -= fmin;
            //cout<<"PLM!\n";
        }
        flow += fmin;
    }
    out<<flow;
    return 0;
}