Cod sursa(job #2770902)

Utilizator Tudor06MusatTudor Tudor06 Data 23 august 2021 23:45:16
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <deque>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

const int NMAX = 1e3;

int flow[NMAX + 1][NMAX + 1];
vector <int> edges[NMAX + 1];
int p[NMAX + 1];
deque <int> dq;

void reset() {
    memset( p, 0, sizeof(p) );
}
bool bfs( int s, int d ) {
    reset();

    p[s] = -1;
    dq.clear();
    dq.push_back( s );

    while ( !dq.empty() ) {
        int node = dq.front();
        dq.pop_front();

        if ( node == d )
            return true;

        for ( auto i : edges[node] ) {
            if ( flow[node][i] > 0 && !p[i] ) {
                p[i] = node;
                dq.push_back( i );
            }
        }
    }
    return false;
}
int main() {
    ifstream fin( "maxflow.in" );
    ofstream fout( "maxflow.out" );
    int n, m, a, b, c, i, s, d, maxflow, totalflow = 0;
    fin >> n >> m;

    for ( i = 0; i < m; i ++ ) {
        fin >> a >> b >> c;
        flow[a][b] = c;
        if ( !flow[b][a] ) {
            edges[a].push_back( b );
            edges[b].push_back( a );
        }
    }

    for ( i = 1; i <= n; i ++ ) {
        random_shuffle( edges[i].begin(), edges[i].end() );
    }

    totalflow = 0;
    s = 1;
    d = n;
    while ( bfs( s, d ) ) {
        for ( auto node : edges[d] ) {
            if ( flow[node][d] > 0 && p[node] ) {
                maxflow = flow[node][d];
                for ( i = node; i != s; i = p[i] ) {
                    maxflow = min( maxflow, flow[p[i]][i] );
                }
                totalflow += maxflow;

                flow[node][d] -= maxflow;
                flow[d][node] += maxflow;
                for ( i = node; i != s; i = p[i] ) {
                    flow[p[i]][i] -= maxflow;
                    flow[i][p[i]] += maxflow;
                }

            }
        }
    }
    fout << totalflow;
    return 0;
}