Cod sursa(job #2971795)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 28 ianuarie 2023 04:34:30
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
/// Ford-Fulkerson algorithm - Solutie de 70 de puncte, Complexitate: O(F * m)   F - Fluxul maxim, m - Nr. de muchii
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define MAX 1005

using namespace std;

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

int dfs(int nod, int minn);

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;
        x = dfs(1, INT_MAX);
        r += x;
    }
    cout << r;

    return 0;
}

int dfs(int nod, int minn)
{
    viz[nod] = 1;
    if(nod == n) return minn;

    for(int it:v[nod]) if(viz[it] == 0 && h[{nod, it}] != 0)
    {
        int x = dfs(it, min(minn, h[{nod, it}]));
        if(x > 0)
        {
            h[{nod, it}] -= x;
            h[{it, nod}] += x;
            return x;
        }
    }

    return 0;
}