Cod sursa(job #2245556)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 25 septembrie 2018 15:03:17
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#include <bitset>
#include <deque>
#include <vector>
#define DIMN 351
#define DIMM 12501
#define INF 2000000000

using namespace std;
int dist[DIMN],tt[DIMN],n,s,d;
bitset <DIMN> f;
vector <int> v[DIMN];
deque <int> dq;
int c[DIMN][DIMN],cst[DIMN][DIMN],fl[DIMN][DIMN];

int bellmanford (){
    int i,nod,vecin;
    for (i=1;i<=n;i++){
        dist[i]=INF;
        tt[i]=0;
    }
    f.reset();
    dq.push_back(s);
    dist[s]=0;
    f[s]=1;
    while (dq.size()){
        nod=dq.front();
       // printf ("%d ",nod);
        for (i=0;i<v[nod].size();i++){
            vecin=v[nod][i];
            if (c[nod][vecin]>fl[nod][vecin] && dist[nod]+cst[nod][vecin]<dist[vecin]){
                dist[vecin]=dist[nod]+cst[nod][vecin];
                tt[vecin]=nod;
                if (!f[vecin]) {// nu e in deque
                    f[vecin]=1;
                    dq.push_back(vecin);
                }
            }
        }
        f[nod]=0;
        dq.pop_front();
    }
    if (dist[d]==INF)
        return 0; /// nu se mai poate pune flux
    return 1;
}
int main()
{
    FILE *fin=fopen ("fmcm.in","r");
    FILE *fout=fopen ("fmcm.out","w");
    int m,i,x,y,cap,cost,sol,nod,vecin,mini;
    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);
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=cap;
        cst[x][y]=cost;
        cst[y][x]=-cost;
    }
    sol=0;
    while (bellmanford()){ /// cat timp mai introduc flux
        vecin=d;
        nod=tt[d];
        mini=INF;
        while (nod){
            mini=min(mini,c[nod][vecin]-fl[nod][vecin]);
            vecin=nod;
            nod=tt[nod];
        }
        vecin=d;
        nod=tt[d];
        while (nod){
            fl[nod][vecin]+=mini;
            fl[vecin][nod]-=mini;
            vecin=nod;
            nod=tt[nod];
        }
        sol+= dist[d]*mini;
    }
    fprintf (fout,"%d",sol);
    return 0;
}