Cod sursa(job #2638153)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 27 iulie 2020 12:38:29
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

const int NMAX = 1000;

int N, M;
vector <int> g[NMAX + 2];

int cap[NMAX + 2][NMAX + 2], flow[NMAX + 2][NMAX + 2];

bool seen[NMAX + 2];
int bef[NMAX + 2];

bool bfs()
{
    for(int i = 1; i <= N; i++)
        seen[i] = false, bef[i] = 0;

    queue <int> q;
    q.push(1);
    seen[1] = true;

    while(!q.empty())
    {
        int node = q.front();
        q.pop();

        for(auto it : g[node])
            if(flow[node][it] < cap[node][it])
                if(!seen[it])
                {
                    bef[it] = node;
                    q.push(it);
                    seen[it] = true;
                }
    }

    return seen[N];
}

int main()
{
    cin >> N >> M;

    for(int i = 1; i <= M; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;

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

        cap[x][y] = z;
    }

    int maxflo = 0;

    while(bfs())
    {
        for(auto node : g[N])
        {
            int pumpFlo = cap[node][N] - flow[node][N];

            for(int n = node; n != 1; n = bef[n])
                pumpFlo = min(pumpFlo, cap[bef[n]][n] - flow[bef[n]][n]);

            maxflo += pumpFlo;

            flow[node][N] += pumpFlo;
            flow[N][node] -= pumpFlo;

            for(int n = node; n != 1; n = bef[n])
            {
                flow[bef[n]][n] += pumpFlo;
                flow[n][bef[n]] -= pumpFlo;
            }
        }
    }

    cout << maxflo;

    return 0;
}