Cod sursa(job #3289707)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 28 martie 2025 11:00:09
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#include <climits>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int inf = INT_MAX;

int n, m, fl[1005][1005], cost[1005][1005], fr[1005], t[1005];
vector<int> v[1005];

bool bfs()
{
    int num[1005];
    for(int i = 0; i <= n; i ++) fr[i] = num[i] = 0;

    num[0] = num[1] = 1; fr[1] = 1;
    for(int i = 1; i <= num[0]; i ++)
    {
        int nod = num[i];
        if(nod == n) continue;

        for(auto x : v[nod])
        {
            if(cost[nod][x] == fl[nod][x] || fr[x])
                continue;

            fr[x] = 1; t[x] = nod;
            num[++ num[0]] = x;
        }
    }

    return fr[n];
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= m; i ++)
    {
        int x, y, c; f >> x >> y >> c;
        cost[x][y] += c;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    int flow, fmin;
    for(flow = 0; bfs();)
        for(auto x : v[n])
        {
            if(cost[x][n] == fl[x][n] || !fr[x])
                continue;

            t[n] = x;

            fmin = inf;
            for(int i = n; i != 1; i = t[i])
                fmin = min(fmin, cost[t[i]][i] - fl[t[i]][i]);

            if(!fmin) continue;

            for(int i = n; i != 1; i = t[i])
            {
                fl[t[i]][i] += fmin;
                fl[i][t[i]] -= fmin;
            }

            flow += fmin;
        }

    g << flow;
    return 0;
}