Cod sursa(job #2071020)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 20 noiembrie 2017 09:16:16
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;

const int NMAX = 1002 ;
const int INF = 1e9 ;

int noNodes, noEdges ;
int remainingFlow [ NMAX ][ NMAX ] , parent [ NMAX ];
int totalFlow ;

vector < int > muc [ NMAX ];
queue < int > que ;

int bfs ( int source,  int dest ){

    while ( !que.empty() ){
        que.pop();
    }

    memset ( parent , 0 , sizeof parent );
    que.push( source );
    parent [ source ] = -1 ;

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

        if ( crNode == dest ){
            return 1 ;
        }

        for ( auto it = muc[ crNode ].begin() ; it != muc[ crNode ].end() ; it++ ){
            int vec = *it ;
            if ( remainingFlow [ crNode ][ *it ] > 0 && !parent[ *it ] ){
                parent [ *it ] = crNode ;
                que.push ( *it );
            }
        }

    }

    return 0 ;
}



int main(){

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

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

    for ( int i = 0 ; i < noEdges ; i++ ){
        int x , y , capacity ;
        scanf("%d%d%d",&x,&y,&capacity);
        remainingFlow [ x ][ y ] = capacity ;
        if ( remainingFlow [ y ][ x ] == 0 ){
            muc [ x ].push_back ( y );
            muc [ y ].push_back ( x );
        }
    }

    while( bfs ( 1 , noNodes ) ){

        int crFlow = INF ;
        for ( int crNode = noNodes ; parent [ crNode ] != -1 ; crNode = parent [ crNode ] ){
            crFlow = min ( crFlow , remainingFlow [ parent [ crNode] ][ crNode ] ) ;
        }

        totalFlow += crFlow ;

        for ( int crNode = noNodes ; parent [ crNode ]!= -1 ; crNode = parent [ crNode ] ){
            remainingFlow [ parent [ crNode ] ] [ crNode ] -= crFlow ;
            remainingFlow [ crNode ] [ parent [ crNode ] ] += crFlow ;
        }

    }
    printf("%d",totalFlow );
    return 0;
}