Cod sursa(job #1398319)

Utilizator maribMarilena Bescuca marib Data 24 martie 2015 09:28:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 1005
#define minim(a, b) ((a)<(b)?a:b)

using namespace std;

int answer, n, m, vfc, vecin, viz[DIM], cap[DIM][DIM], flux[DIM][DIM], better, drum[DIM];

queue <int> q;

vector <int> edges[DIM];

int bf(){
    vfc=1;
    for(int i=1; i<=n; ++i) viz[i]=0;
    viz[vfc]=1;
    q.push(vfc);
    while(!q.empty()){
        vfc=q.front();
        q.pop();
        if(vfc==n)
            continue;
        for(int i=0; i<edges[vfc].size(); ++i){
            vecin=edges[vfc][i];
            if(!viz[edges[vfc][i]]&&cap[vfc][vecin]-flux[vfc][vecin]>0){
                viz[vecin]=1;
                q.push(vecin);
                drum[vecin]=vfc;
            }
        }
    }
    return viz[n];
}

int main()
{
    ifstream in ("maxflow.in");
    ofstream out ("maxflow.out");
    int a, b;
    in>>n>>m;
    for(int i=1; i<=m; ++i){
        in>>a>>b;
        in>>cap[a][b];
        edges[a].push_back(b);
        edges[b].push_back(a);
    }
    while(bf()){
        for(int i=0; i<edges[n].size(); ++i){
            vecin=edges[n][i];
            if(!viz[vecin]||flux[vecin][n]==cap[vecin][n]) continue;
            vfc=vecin;
            better=cap[vecin][n]-flux[vecin][n];
            while(vfc!=1){
                better=minim(better, cap[drum[vfc]][vfc]-flux[drum[vfc]][vfc]);
                vfc=drum[vfc];
            }
            if(!better) continue;
            flux[vecin][n]+=better;
            flux[n][vecin]-=better;
            vfc=vecin;
            while(vfc!=1){
                flux[drum[vfc]][vfc]+=better;
                flux[vfc][drum[vfc]]-=better;
                vfc=drum[vfc];
            }
            answer+=better;
        }
    }
    out<<answer<<"\n";
    in.close();
    out.close();
    return 0;
}