Cod sursa(job #3275332)

Utilizator andreiiorgulescuandrei iorgulescu andreiiorgulescu Data 9 februarie 2025 21:16:18
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.93 kb
#include <bits/stdc++.h>

using namespace std;

struct Dinic
{
    struct Edge
    {
        int x, y, cap, f;
    };

    int n;
    vector<Edge> e;
    vector<vector<int>> g;
    vector<bool> inD, blocked;
    vector<int> d;

    void init(int N)
    {
        n = N;
        g.resize(n + 1);
        d.resize(n + 1);
        blocked.resize(n + 1);
    }

    void baga(int x, int y, int cap)
    {
        Edge aux;
        aux.x = x, aux.y = y, aux.cap = cap, aux.f = 0;
        g[x].push_back(e.size());
        e.push_back(aux);
        swap(aux.x, aux.y);
        aux.cap = 0;
        g[y].push_back(e.size());
        e.push_back(aux);
    }

    bool bfs(int s, int t)
    {
        for (int i = 1; i <= n; i++)
            d[i] = 1e9;
        inD.resize(e.size());
        for (int i = 0; i < e.size(); i++)
            inD[i] = false;
        d[s] = 0;
        queue<int> q;
        q.push(s);
        while (!q.empty())
        {
            int nod = q.front();
            q.pop();
            for (auto vecin : g[nod])
            {
                if (e[vecin].f != e[vecin].cap and d[e[vecin].y] > 1 + d[nod])
                {
                    d[e[vecin].y] = 1 + d[nod];
                    q.push(e[vecin].y);
                }
                if (e[vecin].f != e[vecin].cap and d[e[vecin].y] == 1 + d[nod])
                    inD[vecin] = true;
            }
        }
        if (d[t] != (int)1e9)
            return true;
        return false;
    }

    int dfs(int s, int t, int F)
    {
        //cout << s << ' ' << F << endl;
        if (s == t)
            return F;
        int flow_pushed = 0;
        bool all_blocked = true;
        for (auto vecin : g[s])
        {
            if (!inD[vecin])
                continue;
            if (e[vecin].cap != e[vecin].f and !blocked[e[vecin].y])
            {
                int df = dfs(e[vecin].y, t, min(F, e[vecin].cap - e[vecin].f));
                flow_pushed += df;
                //cout << df << endl;
                F -= df;
                e[vecin].f += df;
                e[vecin ^ 1].f -= df;
            }
            if (e[vecin].cap != e[vecin].f and !blocked[e[vecin].y])
                all_blocked = false;
        }
        if (all_blocked or flow_pushed == 0)
            blocked[s] = true;
        return flow_pushed;
    }

    int maxFlow(int s, int t)
    {
        int ans = 0;
        while (bfs(s, t))
        {
            for (int i = 1; i <= n; i++)
                blocked[i] = false;
            ans += dfs(s, t, 1e9);
        }
        return ans;
    }
};

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

int main()
{
    Dinic ds;
    int n, m;
    in >> n >> m;
    ds.init(n);
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        in >> x >> y >> z;
        ds.baga(x, y, z);
    }
    out << ds.maxFlow(1, n);
    return 0;
}