Cod sursa(job #698029)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 29 februarie 2012 12:05:43
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define pb push_back
#define Nmax 1005
#define Mmax 5005
#define INF 2147000000
using namespace std;

queue< int > Q;
vector< int > v[Nmax];
int F[Nmax][Nmax],C[Nmax][Nmax];
int prev[Nmax];
int N,M,S,D;

inline int BF()
{
    vector< int >:: iterator it;
    int f;

    memset(prev,0,sizeof(prev));
    while( !Q.empty() ) Q.pop();
    Q.push(S);

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

        if( f == D ) continue;

        for( it=v[f].begin(); it!=v[f].end(); ++it)
            if( !prev[*it] && C[f][*it] > F[f][*it] )
            {
                prev[ *it ] = f;
                Q.push( *it );
            }
    }

    return prev[D];
}

int main()
{
    vector< int >:: iterator it;
    int i,x,y,z, flow=0,wh,fmin;

    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(i=1;i<=M;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        v[x].pb(y);
        v[y].pb(x);
        C[x][y] = z;
    }

    S=1; D=N;
    while( BF() )
    {
        for( it=v[D].begin(); it!=v[D].end(); ++it)
            if( prev[*it] )
            {
                prev[D] = *it;
                fmin = INF;

                for( wh=D; wh!=S; wh=prev[wh] )
                    fmin = min(fmin, C[prev[wh]][wh] - F[prev[wh]][wh] );

                if( !fmin ) continue;
                flow += fmin;

                for( wh=D; wh!=S; wh=prev[wh] )
                {
                    F[prev[wh]][wh] += fmin;
                    F[wh][prev[wh]] -= fmin;
                }
            }
    }

    printf("%d\n",flow);
    fclose(stdin); fclose(stdout);
    return 0;
}