Cod sursa(job #1168136)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 7 aprilie 2014 01:48:23
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <vector>
#include <bitset>
#include <fstream>

#define DN 1005
#define pb push_back
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n,m;
vector < int > lst[DN];
bitset < DN > viz;
int C[DN][DN],S,D,prec[DN],arb[DN],F[DN][DN],t[DN],flow;


void read(){

    f>>n>>m;
    for(;m--;)
    {
        int a,b,c;
        f>>a>>b>>c;
        C[a][b] = c;
        lst[a].pb(b);
        lst[b].pb(a);
    }
    S=1; D=n;
}

bool bf(){

    for(int i=1;i<=n;++i){
        viz[i] = false;
        prec[i] = 0;
    }

    arb[0] = 1;
    arb[1] = S;
    for(int i=1;i<=arb[0];++i){

        int nod = arb[i];
        for(int i=0;i<lst[nod].size();++i){

            int next_nod = lst[nod][i];
            if(C[nod][next_nod] == F[nod][next_nod] || viz[next_nod])
                continue;
            arb[ ++arb[0] ] = next_nod;
            viz[ next_nod ] = true;
            t[next_nod] = nod;
        }
    }
    return viz[D];
}

void solve(){

    bool exista_flux = true;
    for(;exista_flux;){

        exista_flux = bf();
        for(int i=0;i<lst[D].size();++i){

            int nod = lst[D][i],fmin=(1<<30);

            if(C[nod][D] == F[nod][D] || !viz[nod])
                continue;

            t[D] = nod;

            for(int nod = D; nod != S ; nod=t[nod])
                fmin=min(fmin,C[t[nod]][nod] - F[t[nod]][nod]);
            if(fmin==0)
                continue;

            for(int nod = D; nod != S ; nod=t[nod]){

                F[ t[nod] ][ nod ] +=fmin;
                F[ nod ][ t[nod] ] -=fmin;
            }
            flow+=fmin;
        }
    }
    g<<flow;
}

int main()
{
    read();
    solve();

    return 0;
}