Cod sursa(job #3259687)

Utilizator matei0000Neacsu Matei matei0000 Data 27 noiembrie 2024 13:32:44
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.28 kb
#include <bits/stdc++.h>

using namespace std;

struct Dinic
{
    struct Edge
    {
        int from, to, cap, last;
    };
    int n, inf = 1e9;
    vector<Edge> edges;
    vector<int> last, dist;
    Dinic(int N)
    {
        n = N;
        last.resize(n + 1, -1);
        dist.resize(n + 1, -1);
    }
    void baga(int from, int to, int cap)
    {
        edges.push_back({from, to, cap, last[from]});
        last[from] = edges.size() - 1;
        edges.push_back({to, from, 0, last[to]});
        last[to] = edges.size() - 1;
    }
    bool bfs(int source, int sink)
    {
        dist.assign(n + 1, inf);
        queue<int> q;
        dist[source] = 0;
        q.push(source);
        while(q.size())
        {
            auto x = q.front();
            q.pop();
            for(int i = last[x]; i != -1; i = edges[i].last)
            {
                if(edges[i].cap > 0 && dist[edges[i].to] == inf)
                {
                    q.push(edges[i].to);
                    dist[edges[i].to] = dist[edges[i].from] + 1;
                }
            }
        }
        return dist[sink] != inf;
    }
    int dfs(int nod, int sink, int push)
    {
        if(push == 0)
            return 0;
        if(nod == sink)
            return push;
        int newPush = 0;
        for(int i = last[nod]; i != -1; i = edges[i].last)
        {
            if(edges[i].cap == 0 || dist[edges[i].to] != 1 + dist[nod])
                continue;
            auto x = dfs(edges[i].to, sink, min(edges[i].cap, push - newPush));
            edges[i].cap -= x;
            edges[i ^ 1].cap += x;
            newPush += x;
        }
        return newPush;
    }
    int maxFlow(int source, int sink)
    {
        int ans = 0;
        while(bfs(source, sink))
        {
            int x = 1;
            while(x)
            {
                x = dfs(source, sink, inf);
                ans += x;
            }
        }
        return ans;
    }
};

signed main()
{
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    int n, m;
    cin >> n >> m;
    Dinic ds(n);
    for(int i = 1; i <= m; i ++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        ds.baga(u, v, w);
    }
    cout << ds.maxFlow(1, n);
}