Cod sursa(job #2247334)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 28 septembrie 2018 13:46:19
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
# include <fstream>
# include <vector>
# include <queue>
# define DIM 355
# define INF 1000000000
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<int> Lista[DIM];
queue<int> q;
int c[DIM][DIM],f[DIM][DIM],val[DIM][DIM],Marcat[DIM],d[DIM],t[DIM],n,m,S,D,i,x,y,cap,cost,mn,sol;
bool flux(){
    for(int i=1;i<=n;i++){
        t[i]=0;
        d[i]=INF;
    }
    d[S]=0;
    q.push(S);
    Marcat[S]=1;
    while(!q.empty()){
        int nc=q.front();
        q.pop();
        Marcat[nc]=0;
        for(int i=0;i<Lista[nc].size();i++){
            int nv=Lista[nc][i];
            if(d[nv]>d[nc]+val[nc][nv]&&f[nc][nv]<c[nc][nv]){
                d[nv]=d[nc]+val[nc][nv];
                t[nv]=nc;
                if(Marcat[nv]==0){
                    Marcat[nv]=1;
                    q.push(nv);
                }
            }
        }
    }
    return t[D]>0;
}
int main () {
    fin>>n>>m>>S>>D;
    for(i=1;i<=m;i++){
        fin>>x>>y>>cap>>cost;
        Lista[x].push_back(y);
        Lista[y].push_back(x);
        c[x][y]=cap;
        val[x][y]=cost;
        val[y][x]=-cost;
    }
    while(flux()){
        mn=INF;
        for(x=D;t[x]>0;x=t[x])
            mn=min(mn,c[t[x]][x]-f[t[x]][x]);
        for(x=D;t[x]>0;x=t[x]){
            f[t[x]][x]+=mn;
            f[x][t[x]]-=mn;
            sol+=val[t[x]][x]*mn;
        }
    }
    fout<<sol<<"\n";
    return 0;
}