Cod sursa(job #2960544)

Utilizator DafinaTrufasTrufas Dafina DafinaTrufas Data 4 ianuarie 2023 17:04:02
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

vector <int> l[1001];
int n, c[1001][1001], fl[1001][1001], t[1001], v[1001];

int bf (int vf)
{
    int i;
    for (i = 1; i <= n; i++)
    {
        v[i] = 0;
        t[i] = 0;
    }
    queue <int> q;
    q.push(vf);
    v[vf] = 1;
    t[vf] = 0;
    while (!q.empty())
    {
        vf = q.front();
        q.pop();
        for (i = 0; i < l[vf].size(); i++)
        {
            if (!v[l[vf][i]] && fl[vf][l[vf][i]] < c[vf][l[vf][i]])
            {
                q.push(l[vf][i]);
                v[l[vf][i]] = 1;
                t[l[vf][i]] = vf;
                if (l[vf][i] == n) return 1;
            }
        }
    }
    return 0;
}

int main()
{int m, flux = 0, i, j, k, x, y, capac, mn;
f >> n >> m;
for (i = 0; i < m; i++)
{
    f >> x >> y >> capac;
    l[x].push_back(y);
    l[y].push_back(x);
    c[x][y] = capac;
}
while (bf(1))
{
    for (k = 0; k < l[n].size(); k++)
    {
        j = l[n][k];
        if (v[j] && fl[j][n] < c[j][n])
        {
            t[n] = j;
            i = n;
            mn = 999999;
            while (i > 1)
            {
                if (c[t[i]][i] - fl[t[i]][i] < mn)
                    mn = c[t[i]][i] - fl[t[i]][i];
                i = t[i];
            }
            flux += mn;
            i = n;
            while (i > 1)
            {
                fl[t[i]][i] += mn;
                fl[i][t[i]] -= mn;
                i = t[i];
            }
        }
    }
}

g << flux;
return 0;
}