Cod sursa(job #2469479)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 7 octombrie 2019 14:52:07
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
#include<vector>
#include<deque>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

int n,m,x,y,capacitate,cost,start,destinatie,nod,t[400];
int dist[50010],f[50010],c[400][400],z[400][400],flux[400][400],minim,sol;
vector <int > v[400];
deque <int> coada;
int bellman(){
     for(int i=1;i<=n;i++){
        dist[i]=1000000000;
        f[i]=0;
    }
    coada.clear();
    coada.push_back(start);
    f[start]=1;
    dist[start]=0;
    int checked=0;

    while(!coada.empty()){
        x=coada.front();
        coada.pop_front();
        f[x]=0;
        for(int i=0;i<v[x].size();i++){
            nod=v[x][i];
            if(dist[nod]>dist[x]+z[x][nod] &&c[x][nod] >flux[x][nod] ){
                dist[nod]=dist[x]+z[x][nod];
                t[nod]=x;
                if(f[nod]==0){
                    f[nod]=1;
                    coada.push_back(nod);
                    if(nod==destinatie){
                        checked=1;
                    }

                }
            }
        }
    }
    return checked;
}
int main(){
    fin>>n>>m>>start>>destinatie;
    for(int i=1;i<=m;i++){
        fin>>x>>y>>capacitate>>cost;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=capacitate;
        z[x][y]=cost;
        z[y][x]=-cost;

    }
    while(bellman()){

        minim=100000000000;
        for (int ii=destinatie; ii!=start; ii= t[ii]){
             minim =min(minim,c[t[ii]][ii]-flux[t[ii]][ii]);
        }
        for (int ii=destinatie; ii!=start; ii= t[ii]){
             flux[t[ii]][ii]+=minim;
             flux[ii][t[ii]]-=minim;
             sol+= minim*z[t[ii]][ii];
        }




    }
    fout<<sol;
    return 0;

}