Cod sursa(job #2128922)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 12 februarie 2018 11:51:05
Problema Cuplaj maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.9 kb
# include <fstream>
# include <vector>
# include <queue>
# define DIM 355
# define INF 1000000000
# define f first
# define s second
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<pair<int,int> > Lista[DIM];
queue<int> q;
pair<int,int> myset[2000];
int c[DIM][DIM],f[DIM][DIM],ct[DIM][DIM];
int Marcat[DIM],d[DIM],val[DIM],t[DIM],aux[DIM];
int n,nh,m,nc,nv,i,j,sursa,destinatie,cost,flux,x,y,dif,sol;
void add(int val,int poz){
    myset[++nh].f=val;
    myset[nh].s=poz;
    int c=nh,p=nh/2;
    while(p!=0){
        if(myset[c].f<myset[p].f){
            swap(myset[c],myset[p]);
            c=p;
            p/=2;
        }
        else
            break;
    }
}
void off(){
    myset[1]=myset[nh--];
    int p=1,c=2;
    while(c<=nh){
        if(myset[c]>myset[c+1]&&c<nh)
            c++;
        if(myset[c]<myset[p]){
            swap(myset[c],myset[p]);
            p=c;
            c*=2;
        }
        else
            break;
    }
}
void bellmanford(){
    for(int i=1;i<=n;i++)
        val[i]=INF;
    val[sursa]=0;
    q.push(sursa);
    while(!q.empty()){
        nc=q.front();
        q.pop();
        Marcat[nc]=0;
        for(int i=0;i<Lista[nc].size();i++){
            nv=Lista[nc][i].f;
            cost=Lista[nc][i].s;
            if(c[nc][nv]&&val[nv]>val[nc]+cost){
                val[nv]=val[nc]+cost;
                if(Marcat[nv]==0){
                    Marcat[nv]=1;
                    q.push(nv);
                }
            }
        }
    }
}
bool fmcm(){
    for(int i=1;i<=n;i++)
        if(i!=sursa){
            d[i]=INF;
            aux[i]=INF;
        }
    add(0,sursa);
    while(nh){
        nc=myset[1].s;
        int j=myset[1].f;
        off();
        if(j!=d[nc])
            continue;
        for(int i=0;i<Lista[nc].size();i++){
            nv=Lista[nc][i].f;
            cost=Lista[nc][i].s;
            if(d[nv]>d[nc]+cost+val[nc]-val[nv]&&f[nc][nv]<c[nc][nv]){
                d[nv]=d[nc]+cost+val[nc]-val[nv];
                aux[nv]=aux[nc]+cost;
                add(d[nv],nv);
                t[nv]=nc;
            }
        }
    }
    for(int i=1;i<=n;i++)
        val[i]=aux[i];
    if(d[destinatie]==INF)
        return 0;
    return 1;
}
int main () {
    fin>>n>>m>>sursa>>destinatie;
    for(i=1;i<=m;i++){
        fin>>x>>y>>flux>>cost;
        Lista[x].push_back(make_pair(y,cost));
        Lista[y].push_back(make_pair(x,-cost));
        ct[x][y]=cost;
        ct[y][x]=-cost;
        c[x][y]=flux;
    }
    bellmanford();
    while(fmcm()){
        nv=destinatie;
        dif=INF;
        for(x=nv;t[x]!=0;x=t[x])
            dif=min(dif,c[t[x]][x]-f[t[x]][x]);
        for(x=nv;t[x]!=0;x=t[x]){
            f[t[x]][x]+=dif;
            f[x][t[x]]-=dif;
            sol+=ct[t[x]][x]*dif;
        }
    }
    fout<<sol<<"\n";
    return 0;
}