Cod sursa(job #879553)

Utilizator veleanduAlex Velea veleandu Data 15 februarie 2013 16:59:07
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;

#define pb push_back
#define FORIT( it, v ) for( typeof( (v).begin() )it=(v).begin(); it!=(v).end(); ++it )
#define max_n 1005
#define INF 0x3f3f3f3f

int From[ max_n ], Bf[ max_n ];
int Edge[ max_n ][ max_n ];
vector< int > T[ max_n ];

int i,n,m,a,b,c,max_flow;

void reconstituire(){
    int minim = INF<<1;
    int varf = n;
    while ( varf!=1 ){
        minim = min ( minim, Edge[ From[ varf ] ][ varf ] );
        varf = From[ varf ];
    }
    varf = n;
    while ( varf!=1 ){
        Edge[ From[ varf ] ][ varf ] -= minim;
        Edge[ varf ][ From[ varf ] ] += minim;
        varf = From[ varf ];
    }
    max_flow+=minim;
    return ;
}

bool get_flow ( ){
    int st,dr;
    st = dr = 1;
    Bf[ 1 ] = 1;
    From[ 1 ] = 1;
    while ( st <= dr ){
        if ( From[ n ] ){
            reconstituire();
            return 1;
        }
        int ind = 0;
        if ( dr - st )
            ind = rand()%( dr-st );
        int nod = Bf[ ind+st ];
        Bf[ ind+st ]=Bf[ dr-- ];

        FORIT( it, T[ nod ] ){
            if ( !From[ *it ] && Edge[ nod ][ *it ] ){
                From[ *it ] = nod;
                Bf[ ++dr ] = *it;
            }
        }
    }
    return 0;
}

void solve (){
    while ( get_flow() ){
        int i;
        for ( i=1; i<=n; ++i ){
            From[ i ] = 0;
        }
    }
}

int main(){

    srand ( time ( NULL ) );

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

    scanf ("%d %d", &n, &m );
    for ( i=1; i<=m; ++i ){
        //printf("penis!");
        scanf ("%d %d %d", &a, &b, &c );
        T[ a ].pb ( b );
        T[ b ].pb ( a );
        Edge[ a ][ b ] = c;
    }
    solve ( );
    printf("%d\n", max_flow );
    return 0;
}