Cod sursa(job #1612533)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 24 februarie 2016 21:49:00
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <bitset>
#include <vector>
#define site vector <int>::iterator
#define DIM 355
#define INF 0x3f3f3f3f

using namespace std;

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

int N,M,S,D;
vector <int> L[DIM];
int F[DIM][DIM],C[DIM][DIM],T[DIM],Z[DIM][DIM];

int Flux ;
bitset <DIM> inQueue;
int d[DIM];

int BF(){
    for(int i=1;i<=N;i++)
        d[i]=INF;
    d[S]=0;
    inQueue.reset();
    inQueue[S]=1;
    queue <int> Q;
    Q.push(S);

    while(!Q.empty()){
        int node = Q.front();
        inQueue[node]=0;
        Q.pop();
        for(site it=L[node].begin();it!=L[node].end();it++)
            if(C[node][*it] > F[node][*it] && d[*it] > d[node] + Z[node][*it]){
                d[*it] = d[node] + Z[node][*it];
                T[*it]=node;
                if(!inQueue[*it]){
                    inQueue[*it]=1;
                    Q.push(*it);
                }
            }
    }

    return d[D]!=INF;
}

int main(){

    fin >> N >> M >> S >> D;

    while(M--){
        int x,y,c,z;
        fin >> x >> y >> c >> z;
        L[x].push_back(y);
        L[y].push_back(x);
        Z[x][y]=z;
        Z[y][x]=-z;
        C[x][y] = c;
    }

    while(BF()){
        int minim = INF;
        int X = D;
        while(T[X]!=0){
            if(minim > C[T[X]][X] - F[T[X]][X])
                minim = C[T[X]][X] - F[T[X]][X];
            X=T[X];
        }

        X = D;

        while(T[X]!=0){
            F[T[X]][X] += minim;
            F[X][T[X]] -= minim;
            Flux += minim * Z[T[X]][X];
            X=T[X];
        }

    }

    fout << Flux << "\n";


}