Cod sursa(job #2425505)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 24 mai 2019 21:07:46
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;

const int INFI  = 0x3f3f3f;
const int NMAX =  1001;
vector < int > V[ NMAX ];
int D[ NMAX ][ NMAX ],
    F[ NMAX ][ NMAX ],
    Tata[ NMAX ],
    Viz[ NMAX ];

int BFS ( int start, int n )  {

    for ( int i = 0; i <= n; ++i ) {
        Tata[ i ] = Viz[ i ] = 0;
    }

    Viz[ start ] = 1;

    queue < int > Q;
    Q.push( start );
    while ( !Q.empty() ) {
        int nod = Q.front();
        Q.pop();

        if ( nod == n ) continue;

        for ( int i = 0; i < V[ nod ].size(); ++i ) {
            int fiu = V[ nod ][ i ];
            if ( Viz[ fiu ] || D[ nod ][ fiu ] == F[ nod ][ fiu ] ) continue ;
            Q.push( fiu );
            Viz[ fiu ] = 1;
            Tata[ fiu ] = nod;
        }

    }

    return Viz[ n ];


}

int main () {

    freopen( "maxflow.in", "r", stdin );
    freopen( "maxflow.out", "w", stdout );

    int n, m, i, x, y, c;

    scanf( "%d%d", &n,&m );
    while ( m-- ) {
        scanf( "%d%d%d", &x,&y,&c );
        V[ x ].push_back( y );
        V[ y ].push_back( x );
        D[ x ][ y ] += c;
    }

    int flow = 0;


    while ( BFS( 1, n ) ) {
        int nod;
        for ( int i = 0; i < V[ n ].size(); ++i ) {
            nod = V[ n ][ i ];
            if ( F[ nod ][ n ] == D[ nod ][ n ] || !Viz[ nod ] ) continue;


            Tata[ n ] = nod;
            int mini = INFI;

            for ( int j = n; j != 1; j = Tata[ j ] )
                mini = min( mini, D[ Tata[ j ] ][ j ] - F[ Tata[ j ] ][ j ] );

            if ( mini == 0 ) continue ;
            flow += mini;

            for ( int j = n; j != 1; j = Tata[ j ] ) {
                F[ Tata[ j ] ][ j ] += mini;
                D[ j ][ Tata[ j ] ] -= mini;
            }
        }

    }

    printf( "%d", flow );

    return 0;
}