Cod sursa(job #1438450)

Utilizator BLz0rDospra Cristian BLz0r Data 19 mai 2015 23:10:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <bitset>
#include <utility>
using namespace std;

#define Nmax 1002
#define inf 0x3f3f3f3f

FILE *f = fopen ( "maxflow.in", "r" );
FILE *g = fopen ( "maxflow.out", "w" );

int cap[Nmax][Nmax], flow[Nmax][Nmax], tata[Nmax], maxflow, Source, Dest, N, M;
vector < int > G[Nmax];
bitset < Nmax > used;
queue < int > Q;

void Init (){
    used.reset();

    while ( !Q.empty() )
        Q.pop();

    Q.push ( Source );
    used[Source] = 1;
}

int BFS (){
   Init();

   vector < int > :: iterator it;

   while ( !Q.empty() ){
        int nod = Q.front();
        Q.pop();

        if ( nod == Dest )
            break;

        for ( it = G[nod].begin(); it < G[nod].end(); ++it ){
            if ( !used[*it] && flow[nod][*it] < cap[nod][*it] ){
                used[*it] = 1;
                tata[*it] = nod;
                Q.push ( *it );
            }
        }
    }
    return used[Dest];
}

void Flow (){
    int fmin;
    vector < int > :: iterator it;

    while ( BFS() ){

        for ( it = G[Dest].begin(); it < G[Dest].end(); ++it ){
            int nod = *it;

            if ( !used[nod] || cap[nod][Dest] == flow[nod][Dest] )
                continue;

            tata[Dest] = nod;

            fmin = inf;

            for ( nod = Dest; nod != Source; nod = tata[nod] )
                fmin = min ( fmin, cap[tata[nod]][nod] - flow[tata[nod]][nod] );

            if ( !fmin )
                continue;

            for ( nod = Dest; nod != Source; nod = tata[nod] ){
                flow[tata[nod]][nod] += fmin;
                flow[nod][tata[nod]] -= fmin;
            }

            maxflow += fmin;

        }
    }
}

int main(){

    int x, y, c;

    fscanf ( f, "%d%d", &N, &M );

    Source = 1;
    Dest = N;

    for ( int i = 1; i <= M; ++i ){
        fscanf ( f, "%d%d%d", &x, &y, &c );
        cap[x][y] += c;
        G[x].push_back ( y );
        G[y].push_back ( x );
    }

    Flow();

    fprintf ( g, "%d", maxflow );

    return 0;
}