Cod sursa(job #2888528)

Utilizator mateitudordmDumitru Matei mateitudordm Data 11 aprilie 2022 15:39:37
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1000

using namespace std;

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

vector<int> ad[nmax + 1];
queue<int> q;
const int inf = 1e9;
int n, flux[nmax + 1][nmax + 1], prv[nmax + 1], f[nmax + 1], cap[nmax + 1][nmax + 1];
bool bfs()
{
    int a;
    for (int i = 1; i <= n; i++)
        f[i] = 0;
    f[1] = 1, q.push (1);
    while (!q.empty())
    {
        a = q.front(), q.pop();
        if (a != n)
            for (auto b : ad[a])
                if (f[b] == 0 && cap[a][b] - flux[a][b] > 0)
                {
                    f[b] = 1;
                    prv[b] = a;
                    q.push (b);
                }
    }
    return f[n];
}

int main()
{
    int m, i, j, a, b, c, minn, ftot = 0;
    cin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        cin >> a >> b >> c;
        ad[a].push_back (b), ad[b].push_back (a);
        cap[a][b] = c;
    }
    while (bfs())
    {
        for (auto a : ad[n])
        {
            if (f[a] && flux[a][n] < cap[a][n])
            {
                minn = inf, prv[n] = a;
                for (i = n; i != 1; i = prv[i])
                    minn = min (minn, cap[prv[i]][i] - flux[prv[i]][i]);
                if (minn)
                {
                    for (i = n; i != 1; i = prv[i])
                    {
                        flux[prv[i]][i] += minn;
                        flux[i][prv[i]] -= minn;
                    }
                    ftot += minn;
                }
            }
        }
    }
    cout << ftot;
    return 0;
}