Cod sursa(job #1689133)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 13 aprilie 2016 23:08:34
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>

#define NMax 355
#define INF 0x3f3f3f3f
using namespace std;
ifstream w("fmcm.in");
ofstream g("fmcm.out");

int viz[NMax],dist[NMax],tata[NMax],ocupat[NMax];
int n,m,s,d,x,y,costt,cap,F;
int cost[NMax][NMax],c[NMax][NMax],f[NMax][NMax];
vector<int> G[NMax];
queue<int> q;

int bellman(){
    for(int i = 1; i <= n; ++i){
        viz[i] = 0;
        dist[i] = INF;
        tata[i] = 0;
    }

    q.push(s);
    tata[s] = 0;
    dist[s] = 0;

    while(!q.empty()){
        int nod = q.front();
        q.pop();
        ocupat[nod] = 0;
        for(int i = 0; i < G[nod].size(); ++i){
            if(dist[G[nod][i]] > dist[nod] + cost[nod][G[nod][i]] && c[nod][G[nod][i]] != f[nod][G[nod][i]]){
                dist[G[nod][i]] = dist[nod] + cost[nod][G[nod][i]];
                tata[G[nod][i]] = nod;


                if(ocupat[G[nod][i]] == 0){
                    q.push(G[nod][i]);
                    ocupat[G[nod][i]] = 1;
                }
            }
        }
    }
    if(tata[d] == 0)
        return 0;
    return 1;
}
int main()
{
    w >> n >> m >> s >> d;
    for(int i = 1; i <= m; ++i){
        w >> x >> y >> cap >> costt;
        c[x][y] = cap;
        G[x].push_back(y);
        G[y].push_back(x);
        cost[x][y] = costt;
        cost[y][x] = -costt;
    }
    while(bellman()){
        int fm = INF;
        for(int nod = d; nod != s; nod = tata[nod]){
            fm = min(fm, c[tata[nod]][nod] - f[tata[nod]][nod]);
        }
        for(int nod = d; nod != s; nod = tata[nod]){
            f[tata[nod]][nod] += fm;
            f[nod][tata[nod]] -= fm;
        }
        F += (fm * dist[d]);
    }
    g << F << '\n';
    return 0;
}