Cod sursa(job #2971798)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 28 ianuarie 2023 04:48:07
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
/// Edmonds-Karp algorithm - Solutie de 70 de puncte, Complexitate: O(n * m * m), m - Nr. de muchii, n - Nr. de noduri
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define MAX 1005

using namespace std;

vector < int > v[MAX];
map < pair < int, int >, int > h;
int n, prec[MAX];
bool viz[MAX];

int bfs(int nod);

int main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    int m, i, x, y, z, r = 0;

    cin >> n >> m;
    for(i = 1; i <= m; i++)
    {
        cin >> x >> y >> z;
        v[x].pb(y), h[{x, y}] = z;
        if(h[{y, x}] == 0) v[y].pb(x);
    }

    x = 1;
    while(x != 0)
    {
        for(i = 1; i <= n; i++) viz[i] = 0;
        prec[1] = 0;
        x = bfs(1);
        r += x;
    }
    cout << r;

    return 0;
}

int bfs(int nod)
{
    int minn = INT_MAX, i;

    queue < int > q;
    q.push(nod), viz[nod] = 1;
    while(q.empty() == 0)
    {
        nod = q.front(), q.pop();
        for(int it:v[nod]) if(viz[it] == 0 && h[{nod,it}] > 0)
        {
            prec[it] = nod;
            if(it == n)
            {
                i = n;
                while(prec[i] != 0)
                {
                    minn = min(minn, h[{prec[i], i}]);
                    i = prec[i];
                }

                i = n;
                while(prec[i] != 0)
                {
                    h[{prec[i], i}] -= minn;
                    h[{i, prec[i]}] += minn;
                    i = prec[i];
                }

                return minn;
            }
            else q.push(it), viz[it] = 1;
        }
    }

    return 0;
}