Cod sursa(job #3156604)

Utilizator Tudor06MusatTudor Tudor06 Data 11 octombrie 2023 21:10:15
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.56 kb
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

struct Dinic {
    int n;
    struct edge {
        int from;
        int to;
        int cap;
    };
    vector <edge> muchii;
    vector <int> firstGood;
    vector<vector <int>> edges;
    vector <bool> viz;
    vector <int> dist;

    void init( int N ) {
        n = N;
        edges.resize( n );
        viz.resize( n );
        dist.resize( n );
        firstGood.resize( n );
    }

    void addEdge( int a, int b, int c ) {
        edges[a].push_back( muchii.size() );
        muchii.push_back( (edge){ a, b, c } );

        edges[b].push_back( muchii.size() );
        muchii.push_back( (edge){ b, a, 0 } );
    }
    bool bfs( int source, int dest ) {
        for ( int i = 0; i < n; i ++ ) {
            dist[i] = n;
            viz[i] = false;
        }
        queue <int> q;
        q.push( source );
        dist[source] = 0;
        while ( !q.empty() ) {
            int node = q.front();
            q.pop();
            viz[node] = true;
            for ( auto i : edges[node] ) {
                edge e = muchii[i];
                if ( !viz[e.to] && e.cap && dist[node] + 1 < dist[e.to] ) {
                    dist[e.to] = dist[node] + 1;
                    q.push( e.to );
                }
            }
        }
        return dist[dest] != n;
    }
    int dfs( int node, int dest, int pushed = INF ) {
        if ( pushed == 0 || node == dest ) return pushed;
        viz[node] = true;
        for ( int& i = firstGood[node]; i < edges[node].size(); i ++ ) {
            int f = pushed, j = edges[node][i];
            edge e = muchii[j];
            if ( dist[e.to] == dist[node] + 1 && ( f = dfs( e.to, dest, min( pushed, e.cap ) ) ) ) {
                muchii[j].cap -= f;
                muchii[j^1].cap += f;
                return f;
            }
        }
        return 0;
    }

    int maxFlow( int source, int dest ) {
        int maxflow = 0;
        while ( bfs( source, dest ) ) {
            for ( int i = 0; i < n; i ++ ) firstGood[i] = 0;
            int flow = 0;
            while ( ( flow = dfs( source, dest ) ) ) maxflow += flow;
        }
        return maxflow;
    }
};


int main() {
    ifstream fin( "maxflow.in" );
    ofstream fout( "maxflow.out" );
    int n, m;
    fin >> n >> m;
    Dinic graph;
    graph.init( n );
    for ( int i = 0, a, b, c; i < m; i ++ ) {
        fin >> a >> b >> c;
        graph.addEdge( a - 1, b - 1, c );
    }
    fout << graph.maxFlow( 0, n - 1 );
    return 0;
}