Cod sursa(job #1699313)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 6 mai 2016 23:53:53
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define DIM 355

using namespace std;

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

int N,M,S,D,x,y,c,z;
int Flux;

int C[DIM][DIM],F[DIM][DIM],Z[DIM][DIM];
int Dist[DIM],T[DIM];

queue <int> Q;
vector <int> L[DIM];
bitset <DIM> viz;

int BF(){

    viz.reset();
    memset(Dist,0x3f3f3f3f,sizeof(Dist));
    Q.push(S);
    viz[S]=1;
    Dist[S]=0;

    while(!Q.empty()){
        int node = Q.front();
        viz[node]=0;
        Q.pop();
        for(int i=0;i<L[node].size();i++){
            int vec = L[node][i];
            if(F[node][vec] < C[node][vec] && Dist[vec] > Dist[node] + Z[node][vec]){
                Dist[vec] = Dist[node] + Z[node][vec];
                T[vec] = node;
                if(!viz[vec]){
                    Q.push(vec);
                    viz[vec]=1;
                }
            }
        }

    }

    return Dist[D] != 0x3f3f3f3f;

}

int main(){

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

    for(int i=1;i<=M;i++){
        fin >> x >> y >> c >> z;
        L[x].push_back(y);
        C[x][y]=c;
        Z[x][y]=z;
        Z[y][x]=-z;
    }

    while(BF()){

        int node = D;
        int minim = 0x3f3f3f3f;

        while(T[node]!=0){
            minim = min(minim,C[T[node]][node] - F[T[node]][node]);
            node = T[node];
        }

        node = D;

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

    }

    fout << Flux << "\n";

}