Cod sursa(job #2469472)

Utilizator radugnnGone Radu Mihnea radugnn Data 7 octombrie 2019 14:32:30
Problema Flux maxim de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <deque>
#include <vector>
#define DIM 360
using namespace std;
ifstream fin ("a.in");
ofstream fout ("a.out");
bitset <400> viz;
vector<int> L[DIM];
deque<int> q;
int n,i,vecin,x,y,s,d,m,c,z,nod,minim,cost,flux;
int Z[DIM][DIM],C[DIM][DIM],F[DIM][DIM],D[DIM],T[DIM];
int bell(){
    int gasit=0;
    for(i=1;i<=n;i++)
        viz[i]=0;
    viz.reset();
    q.push_back(s);
    viz[s]=1;
    for(i=2;i<n;i++)
        D[i]=1000000000;
    D[s]=0;
    while(!q.empty()){
        x=q.front();
        q.pop_front();
        viz[x]=0;
        for(i=0;i<L[x].size();i++){
            if(C[L[x][i]] > F[L[x][i]]){
                y=L[x][i];
                if(D[y]>D[x]+Z[x][y]){
                    D[y]=D[x]+Z[x][y];
                    T[y]=x;
                if(viz[vecin]==0)
                q.push_back(y);
                viz[y]=1;
                if(y==d)
                    gasit=1;
                }
            }
        }
    }
    return gasit;
}
int main(){
    fin>>n>>m>>s>>d;
    for(i=1;i<=m;i++){
        fin>>x>>y>>c>>z;
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=c;
        Z[x][y]=z;
        Z[y][x]=-z;
    }
    while(bell()){
        nod=d;
        minim=200000000;

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

        nod=d;
        while(nod!=s){
            F[T[nod]][nod]+=minim;
            F[nod][T[nod]]-=minim;
            nod=T[nod];
            cost+=minim*Z[T[nod]][nod];
    }

        flux+=minim;
    }
    fout<<cost;
    return 0;
}
///neterminata