Cod sursa(job #2983262)

Utilizator Vincent47David Malutan Vincent47 Data 21 februarie 2023 22:32:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <queue>
#include <bitset>
#include <vector>

using namespace std;

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

using VI = vector<int>;
using VVI = vector<VI>;

const int inf = 0x3f3f3f3f;
const int dim = 1005;

bitset<dim> V;
VVI G;
queue <int> Q;
int n, m, C[dim][dim], t[dim];

bool bfs(int source, int sink)
{
    V.reset();
    V[source] = 1;
    Q.push(source);
    while(!Q.empty())
    {
        int x = Q.front();
        Q.pop();
        if (x == sink)
            continue;
        for (auto y : G[x])
        {
            if (!V[y] && C[x][y] > 0)
            {
                t[y] = x;
                V[y] = 1;
                Q.push(y);
            }
        }
    }
    return V[sink];
}

    int MaxFlow(int source, int sink)
    {
        int maxFlow = 0, fmin;
        while (bfs(source, sink))
            for (auto x : G[sink])
            {
                if (!V[x] || C[x][sink] <= 0)
                    continue;
                t[sink] = x;
                fmin = inf;
                for (int i = sink; i != source; i = t[i])
                    fmin = min (fmin, C[t[i]][i]);
                for (int i = sink; i != source; i = t[i])
                {
                    C[t[i]][i] -= fmin;
                    C[i][t[i]] += fmin;
                }
                maxFlow += fmin;
            }
        return maxFlow;
    }

int main()
{
    int x, y, w;
    cin >> n >> m;
    G = VVI(n + 1);
    for (int i = 1; i <= m; ++i)
    {
        cin >> x >> y >> w;
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y] += w;
    }
    cout << MaxFlow(1, n);

    return 0;
}