Cod sursa(job #800851)

Utilizator danalex97Dan H Alexandru danalex97 Data 22 octombrie 2012 20:12:56
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int Nmax = 1010;

vector<int> A[Nmax];
int C[Nmax][Nmax];

int N,M,Flux;
int Dad[Nmax],Marked[Nmax];

queue<int> Q;

typedef vector<int>::iterator IT;

bool BF()
{
    memset(Dad,0,sizeof(Dad));
    memset(Marked,0,sizeof(Marked));
    Marked[1] = 1;
    bool Ok = 0;

    for ( Q.push(1) ; Q.size() ; Q.pop() )
        for ( IT it = A[Q.front()].begin() ; it!= A[Q.front()].end() ; ++it )
            if ( !Marked[ *it ] && C[Q.front()][ *it ] )
            {
                Marked[ *it ] = 1;
                if ( *it == N )
                {
                    Ok = 1;
                    continue;
                }
                Dad[ *it ] = Q.front();
                Q.push( *it );
            }

    return Ok;
}

ifstream F("maxflow.in");
ofstream G("maxflow.out");

int main()
{
    F>>N>>M;
    for (int i=1,x,y,c;i<=M;++i)
    {
        F>>x>>y>>c;
        A[ x ].push_back( y );
        A[ y ].push_back( x );
        C[x][y]=c;
    }

    Flux = 0;
    while ( BF() )
        for ( IT it = A[N].begin(); it!=A[N].end(); ++it )
        {
            int Nod , Flow = C[ *it ][ N ];
            for ( Nod = *it ; Dad[ Nod ] ; Nod = Dad[Nod] )
                Flow = min ( Flow , C[ Dad[Nod] ][ Nod ] );
            if ( Flow == 0 ) continue;
            for ( Nod = *it ; Dad[ Nod ] ; Nod = Dad[Nod] )
            {
                C[Dad[Nod]][Nod] -= Flow;
                C[Nod][Dad[Nod]] += Flow;
            }
            C[*it][N] -= Flow;
            C[N][*it] += Flow;
            Flux += Flow;
        }
    G<<Flux<<'\n';
}