Cod sursa(job #2924505)

Utilizator petru-robuRobu Petru petru-robu Data 3 octombrie 2022 21:07:00
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin  ("maxflow.in");
ofstream fout ("maxflow.out");

const int INF = 2e9;
const int NMAX= 1005;

int n, m, x, y, c, minflow, flux;

int cap[NMAX][NMAX], flow[NMAX][NMAX];
vector <int> edge[NMAX];

int crt, parent[NMAX];
bool viz[NMAX];

bool find_path()
{
    queue<int> path;

    for(int i=1; i<=n; i++)
        viz[i] = false;

    viz[1] = true;
    path.push(1);

    while(!path.empty())
    {

        crt = path.front();
        path.pop();

        for(auto nxt : edge[crt])
            if(!viz[nxt] && flow[crt][nxt] < cap[crt][nxt])
            {
                parent[nxt] = crt;
                viz[nxt] = true;

                path.push(nxt);

                if(nxt==n)
                    return true;
            }
    }
    return false;
}

int main()
{
    fin>>n>>m;

    for(int i=1; i<=m; i++)
    {
        fin>>x>>y>>c;
        edge[x].push_back(y);
        edge[y].push_back(x);
        cap[x][y] = c;
    }


    while(find_path())
        for(auto leaf : edge[n])
            if(viz[leaf] && flow[leaf][n] < cap[leaf][n])
            {
                parent[n] = leaf;
                minflow = INF;

                crt = n;
                while(parent[crt])
                {
                    minflow = min(minflow, cap[parent[crt]][crt] - flow[parent[crt]][crt]);
                    crt = parent[crt];
                } //bottleneck

                flux += minflow;

                crt = n;
                while(parent[crt])
                {
                    flow[parent[crt]][crt] += minflow;
                    flow[crt][parent[crt]] -= minflow;
                    crt = parent[crt];
                }
            }

    fout<<flux;
    return 0;
}