Cod sursa(job #2079367)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 1 decembrie 2017 10:59:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>



using namespace std;

const int INF = 1e6 ;
const int N = 1010 ;

int noNodes , noEdges ;
int remainingFlow [ N ][ N ];
int dist [ N ];
vector < int > muc [ N ] ;
int vecPoint [ N ] ;

int bfs (){
    static int node ;

    memset( dist , -1 , sizeof dist );
    queue < int > que ;

    dist [ 1 ] = 0 ;
    que.push( 1 );

    while ( !que.empty() ){
        node = que.front() ;
        que.pop() ;

        for ( int vec : muc[ node ] ){
            if ( dist [ vec ] == -1 && remainingFlow[ node ][ vec ] > 0  ){
                dist [ vec ] = dist [ node ] + 1 ;
                que.push( vec );
            }
        }

    }

    return dist [ noNodes ] != -1  ;
}

int dfs ( int node , int crFlow ){

    if ( node == noNodes ){
        return crFlow ;
    }

    auto it = muc [ node ].begin() ;
    for ( advance( it , vecPoint [ node ] ) ; it != muc[ node ].end() ; it++ , vecPoint [ node ] ++ ){
        int vec = *it ;

        if ( remainingFlow [ node ] [ *it ] == 0 || dist [ vec ] != dist [ node ] + 1  ){
            continue ;
        }
        int flow = dfs ( vec , min ( crFlow , remainingFlow [ node ][ *it ] ) );
        if ( flow ){
            remainingFlow [ node ][ vec ] -= flow ;
            remainingFlow [ vec ][ node ] += flow ;
            return flow ;
        }
    }
    return 0 ;
}


int main(){

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

    scanf("%d%d",&noNodes , &noEdges );

    for ( int i = 0 ; i < noEdges ; i++ ){
        int x , y , crCapacity ;
        scanf("%d%d%d", &x , &y , &crCapacity );

        remainingFlow [ x ][ y ] = crCapacity ;
        if ( !remainingFlow [ y ][ x ] ){
            muc [ x ].push_back( y );
            muc [ y ].push_back( x );
        }

    }


    int totalFlow = 0 ;

    while ( bfs () ){

        memset( vecPoint , 0 , sizeof vecPoint );

        while ( int crFlow = dfs ( 1 , INF  ) ){
            totalFlow += crFlow ;
        }


    }
    printf("%d",totalFlow);

    return 0;
}