Cod sursa(job #2247338)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 28 septembrie 2018 13:55:02
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <deque>
#include <bitset>
#include <algorithm>
#define DIMN 351
#define DIMM 12501
#define INF 2000000000
using namespace std;
int n,m,s,d;
int dist[DIMN],cst[DIMN][DIMN],c[DIMN][DIMN];
pair <int,int> nr[DIMM];
vector <int> v[DIMN];
deque <int> dq;
bitset <DIMN> f;
inline void bellmanford(){
    int i,nod,vecin;
    f.reset();
    for (i=1;i<=n;i++)
        if (i!=s)
            dist[i]=INF;
    dq.push_back(s);
    f[s]=1;
    while (dq.size()){
        nod=dq.front();
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (dist[nod]+cst[nod][vecin]<dist[vecin]){
                dist[vecin]=dist[nod]+cst[nod][vecin];
                if (!f[vecin]) {// nu e in deque
                    f[vecin]=1;
                    dq.push_back(vecin);
                }
            }
        }
        dq.pop_front();
        f[nod]=0;
    }
    /// C[i] = distanta minima de la sursa la i
}
int main()
{
    FILE *fin=fopen ("fmcm.in","r");
    FILE *fout=fopen ("fmcm.out","w");
    int i,x,y,cap,cost;
    fscanf (fin,"%d%d%d%d",&n,&m,&s,&d);
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d%d%d",&x,&y,&cap,&cost);
        c[x][y]=cap;
        cst[x][y]=cost;
        nr[i]=make_pair(x,y);
        //cst[y][x]=-cost;
        v[x].push_back(y);
        //v[y].push_back(x);
    }
    bellmanford();
    for (i=1;i<=m;i++){
        x=nr[i].first;
        y=nr[i].second;
        cst[x][y]+=dist[x]-dist[y]; /// costul bun sa fie >= 0
        cst[y][x]=-cst[x][y];
    }
    return 0;
}