Cod sursa(job #2469474)

Utilizator maria15Maria Dinca maria15 Data 7 octombrie 2019 14:48:21
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#include <deque>
#include <vector>
#include <bitset>
#define inf 12500000

using namespace std;

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

int n, m, s, d, sol, a, b, ca, co, nod, minim, tata, t[352], total[352], cap[352][352], cost[352][352], flux[352][352], i;
bitset<352> f;
deque<int> coada;
vector<int> v[352];

bool bellmanford(){
    f.reset();
    f[s] = 1;
    coada.push_back(s);
    for(int i = 1;i<=n;i++)
        total[i] = inf;
    total[s] = 0;
    int ok = 0;
    while(!coada.empty()){
        int p = coada[0];
        f[p] = 0;
        coada.pop_front();
        for(int i = 0;i<v[p].size();i++){
            int vecin = v[p][i];
            if(cap[p][vecin] > flux[p][vecin] && total[vecin] > total[p] + cost[p][vecin]){
                total[vecin] = total[p] + cost[p][vecin];
                t[vecin] = p;
                if(f[vecin] == 0){
                    f[vecin] = 1;
                    coada.push_back(vecin);

                }
                if(vecin == d)
                    ok = 1;
            }
        }
    }
    return ok;
}

int main(){
    fin>>n>>m>>s>>d;
    for(i=1;i<=m;i++){
        fin>>a>>b>>ca>>co;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b] = ca;
        cost[a][b] = co;
        cost[b][a] = -co;
    }
    while(bellmanford()){
        nod = d, tata = t[nod];
        minim = cap[tata][nod];
        while(tata){
            minim = min(minim, cap[tata][nod] - flux[tata][nod]);
            nod = tata;
            tata = t[nod];
        }
        nod = d, tata = t[nod];
        while(tata){
            flux[tata][nod] += minim;
            flux[nod][tata] -= minim;
            nod = tata;
            tata = t[nod];
        }
        sol += total[d]*minim;
    }
    fout<<sol;
    return 0;
}