Cod sursa(job #2750497)

Utilizator OvidRata Ovidiu Ovid Data 11 mai 2021 17:44:40
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.17 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
//#define int ll


ifstream fin("fmcm.in"); ofstream fout("fmcm.out");
#define cin fin
#define cout fout



int t, n, m, s;

int g[351][351];
int D[351];
int e[12501][4];


void bellman_ford(){

    for(int i=1; i<=n; i++){
        D[i]=1e9;
    }
    D[s]=0;
    for(int v=1; v<=n; v++){
        for(int i=1; i<=m; i++){
            D[e[i][1] ]=min(D[e[i][1] ], D[e[i][0] ]+g[e[i][0] ][e[i][1] ]);
            //D[e[i][0] ]=min(D[e[i][0] ], D[e[i][1] ]+g[e[i][1] ][e[i][0] ]);
        }
    }

}


int g2[351][351], r[351][351], c[351][351];
vector<int> g3[351];


void prepare(){
    for(int i=1; i<=m; i++){
        g2[e[i][0] ][e[i][1] ]=g[e[i][0] ][e[i][1] ]+D[e[i][0] ]-D[e[i][1] ];
        g2[e[i][1] ][e[i][0] ]=-g2[e[i][0] ][e[i][1] ];
        c[e[i][0] ][e[i][1] ]=e[i][2];
    }
}


int d[351], f[351];
bool v[351];
int par[351];
int res=0;
bool dijkstra(){

    for(int i=1; i<=n; i++){
        d[i]=1e9; f[i]=0;
        v[i]=false;
        par[i]=0;
    }

    f[s]=1e9; d[s]=0;

    multiset<pair<pii, int> > ms;
    ms.insert({{d[s], -f[s] }, s});

    while(!ms.empty()){
        auto pr=*ms.begin(); ms.erase(ms.begin());
        int nod=pr.sc;
        v[nod]=true;
        for(auto u:g3[nod]){
            if(v[u]){continue;}
            pii st={d[u], -f[u] };
            auto it=ms.find({st, u });
            if(it==ms.end()){
                if(  min(f[nod], c[nod][u]-r[nod][u]  )>0 ){
                    d[u]=d[nod]+g2[nod][u];
                    f[u]=min(f[nod], c[nod][u]-r[nod][u]  );
                    ms.insert({{d[u], -f[u]}, u});
                    par[u]=nod;
                }
            }
            else{
                if(  (min(f[nod], c[nod][u]-r[nod][u]  )>0) && ( mp(  d[nod]+g2[nod][u], -min(f[nod], c[nod][u]-r[nod][u]  )   )<it->ft   )   ){
                    d[u]=d[nod]+g2[nod][u];
                    f[u]=min(f[nod], c[nod][u]-r[nod][u]  );
                    ms.erase(it);
                    ms.insert({{d[u], -f[u]}, u});
                    par[u]=nod;
                }
            }
        }


    }

    if(f[t]==0){
        return false;
    }

    int ac=t;
    while(ac!=s){
        r[par[ac] ][ac]+=f[t];
        r[ac ][par[ac] ]-=f[t];
        ac=par[ac];
    }
    //cout<<f[t]<<" "<<(d[t]+D[t])<<"\n";
    res+=f[t]*(d[t]+D[t]);

    for(int i=1; i<=n; i++){
        D[i]=D[i]+d[i];
    }
    prepare();
    return true;
}




int32_t main(){
INIT
cin>>n>>m>>s>>t;
for(int i=1; i<=m; i++){
    cin>>e[i][0]>>e[i][1]>>e[i][2]>>e[i][3];
    g[e[i][0] ][e[i][1] ]=e[i][3];
    //g[e[i][1] ][e[i][0] ]=-e[i][3];
    g3[e[i][0] ].pb(e[i][1] );
    g3[e[i][1] ].pb(e[i][0]);
}


bellman_ford();
//cout<<D[t]<<"\n";
prepare();
while(dijkstra() ){}
cout<<res<<"\n";

return 0;
}