Cod sursa(job #3227102)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 25 aprilie 2024 13:02:10
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.02 kb
#include <bits/stdc++.h>
using namespace std;

///----------TOGGLES
#define FIO
//#define LONGER
//#define TESTS

///---------

#ifdef LONGER
    #define int long long
#endif // LONGER

#ifdef FIO
    #ifdef LOCAL
        const string fname="maxflow";
    #else
        const string fname="fmcm";
    #endif // LOCAL
    ifstream in(fname+".in");
    ofstream out(fname+".out");
    #define cin in
    #define cout out
#endif // FIO

///--------

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

///-------STL++-----
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) x.size()
#define pb(x,y) x.push_back(y)
#define mp(x,y) make_pair(x,y)
#define fr(i,n) for(int i=1;i<=n;i++)
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pdd = pair<double, double>;
using veci = vector<int>;
using vecp = vector<pii>;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T> >;

///-----CODE GOES HERE-----

const int maxn = 1005;
const int maxval = 1e9+7;

int n,m;
veci fg[maxn];
int cap[maxn][maxn], cst[maxn][maxn];
int d[maxn],inq[maxn], tata[maxn];
int s,f;

pii fluxBfs()
{
    fill(d+1, d+n+1, maxval);
    fill(inq+1, inq+n+1, 0);
    fill(tata+1, tata+n+1, -1);


    d[s]=0;
    inq[s]=1;

    queue<int> q;
    q.push(s);
    while(!q.empty())
    {
        int t=q.front();
        //cerr<<"here "<<t<<'\n';
        q.pop();
        inq[t]=0;

        for(auto e:fg[t])
        {
            if(cap[t][e]<=0) continue;
            if(d[e]>cst[t][e]+d[t])
            {
                d[e]=cst[t][e]+d[t];
                tata[e]=t;
                if(!inq[e])
                {
                    inq[e]=1;
                    q.push(e);
                }
            }
        }
    }

    /*for(int i=1;i<=n;i++)
    {
        cerr<<d[i]<<' ';
    }
    cerr<<'\n';*/

    if(tata[f]==-1) return mp(0,0);

    int ans=0;
    int c=0;
    int j, add=0;
    add=maxval;
    j=f;
    while(j!=s)
    {
        add=min(add, cap[tata[j]][j]);
        j=tata[j];
    }
    if(add==0) return mp(0,0);

    j=f;
    while(j!=s)
    {
        cap[tata[j]][j]-=add;
        cap[j][tata[j]]+=add;
        c+=cst[tata[j]][j]*add;
        j=tata[j];
    }
    ans+=add;

    return mp(ans,c);
}

pii doFlux()
{
    int ans=0, cst=0;
    pii x;
    while((x=fluxBfs()).first!=0) ans+=x.first, cst+=x.second;
    return mp(ans,cst);
}


void solve()
{
    {
        cin>>n>>m>>s>>f;
        int a,b,c, d;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b>>c>>d;
            pb(fg[a],b);
            pb(fg[b],a);
            cap[a][b]=c;

            cst[a][b]=d;
            cst[b][a]=-d;
        }
    }
    pii x=doFlux();
    cout<<x.second<<'\n';
}

///---MAIN FUNC-------

int32_t main()
{
    IOS;
    int t=1;
    #ifdef TESTS
        cin>>t;
    #endif // TESTS
    while(t--)
    {
        solve();
    }
    return 0;
}