Cod sursa(job #857790)

Utilizator Coman95coman cosmin Coman95 Data 18 ianuarie 2013 12:54:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;

#define NMAX 1001
#define INF 0x3f3f3f3f

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n, m, Fmax;
vector<bool> s;
vector<int> t;
queue<int> Q;
vector<int> g[NMAX];
int F[NMAX][NMAX];
int C[NMAX][NMAX];

bool BF( int nod );
void MaxFlow(  );

int main()
{
    int a, b, c;
    fin >> n >> m;

    t.resize( n + 1 );
    for( int i = 1; i <= m; ++i )
    {
        fin >> a >> b >> c;
        g[a].push_back( b );
        g[b].push_back( a );
        C[a][b] = c;
    }
    MaxFlow();
    fout << Fmax << '\n';
    fin.close();
    fout.close();
    return 0;
}

bool BF( int nod )
{
 //   vector<bool> s(n + 1, false);
    int x;
    s.assign( n + 1, false);
    Q.push( nod );
    s[nod] = true;
    while( !Q.empty() )
    {
        x = Q.front();
        Q.pop();
        if( x == n )
            continue;
        for( vector<int>::iterator it = g[x].begin(); it != g[x].end(); ++it)
        {
            if( s[*it] )
                continue;
            if( C[x][*it] > F[x][*it] )
            {
                Q.push( *it );
                s[*it] = true;
                t[*it] = x;
            }
        }
    }
    return s[n];
}


void MaxFlow( )
{
   for ( int Fmin = 0; BF( 1 );)
    {
        // det Fmin
        for( vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it )
        {
            t[n] = *it;
            if( !s[*it])
                continue;
            if( C[t[n]][n] > F[t[n]][n] )
            {
                Fmin = INF;
                for( int i = n; i != 1; i = t[i] )
                    Fmin = min( Fmin, C[t[i]][i] - F[t[i]][i] );
                if( Fmin == 0 )
                    continue;

                // marim fluxul
                for( int i = n; i != 1; i = t[i] )
                    F[t[i]][i] += Fmin, F[i][t[i]] -= Fmin;
                Fmax += Fmin;
            }
        }
    }
}