Cod sursa(job #3155468)

Utilizator andystarzSuna Andrei andystarz Data 8 octombrie 2023 14:33:30
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include<queue>
using namespace std;
struct Dinic
{
    struct Edge
    {
        int from, to, cap, ult;
    };
    int n;
    vector<int>dist; ///in dist tinem distanta minima de la orice nod la source
    vector<int>last; ///pentru un nod tinem ultimul edge introdus
    vector<Edge>edges; ///tinem toate edge-urile
    queue<int>cueue; ///

    Dinic (int cn)
    {
        n=cn;
        last.assign(n+1, -1);
    }
    void introdus(int from, int to, int cap)
    {
        edges.push_back({from, to, cap, last[from]});
        ///cout<<last[from]<<" ";
        last[from]=edges.size()-1;
        edges.push_back({to, from, 0, last[to]});
        ///cout<<last[to]<<" ";
        last[to]=edges.size()-1;
    }
    bool bfs(int source, int sink) ///verificam daca mai e vreun drum si construim distantele
    {
        dist.assign(n+1, 1e9);
        cueue.push(source); ///in cueue tin toate nodurile de vizitat
        dist[source]=0;
        while (!cueue.empty())
        {
            int poz=cueue.front();
            cueue.pop();

            for (int i=last[poz]; i!=-1; i=edges[i].ult)
            {
                if (dist[edges[i].to]==1e9&&edges[i].cap>0)
                {
                    dist[edges[i].to]=1+dist[poz];
                    cueue.push(edges[i].to);
                }
            }
        }
        return (dist[sink]!=1e9);
    }
    int dfs(int source, int sink, int flow)
    {
        if (source==sink)
            return flow;
        int ans=0;
        for (int i=last[source]; i!=-1; i=edges[i].ult)
        {
            ///cout<<"TURIP";
            if (edges[i].cap>0&&dist[edges[i].to]== (1+dist[edges[i].from]))
            {
                int sent=dfs(edges[i].to, sink, min(flow, edges[i].cap));
                ans+=sent;
                flow-=sent;
                edges[i].cap-=sent;
                edges[i^1].cap+=sent;
            }
        }
        return ans;
    }
    int MaximumFlow(int source, int sink)
    {
        long long int ans=0;
        while (bfs(source, sink))
        {
            ans+=dfs(source, sink, 1e9);
        }
        return ans;
    }
};
int main()
{
    ifstream cin ("maxflow.in");
    ofstream cout ("maxflow.out");
    int n, e, a, b, capacitate;
    cin>>n>>e;
    Dinic d(n);
    for (int i=0; i<e; i++)
    {
        cin>>a>>b>>capacitate;
        d.introdus(a, b, capacitate);
    }
    cout<<d.MaximumFlow(1, n);
}