Cod sursa(job #2098852)

Utilizator patcasrarespatcas rares danut patcasrares Data 3 ianuarie 2018 16:36:55
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <bits/stdc++.h>
#include<vector>
#define DN 355
#define pb push_back
#define x first
#define y second
#include<queue>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,s,d,dist[DN],f[DN][DN],rez,pr[DN],oldc[DN],r[DN];
int cap[DN][DN],cost[DN][DN],g,h,c,z;
vector<int>v[DN];
int inq[DN];
queue<int>q;
int old[DN];
priority_queue<pair<int,int> >H;
int nod,cs;
int dijkstra()
{
    for(int i=1;i<=n;i++)
        dist[i]=(1<<28);
    dist[s]=0;
    r[s]=0;
    H.push({0,s});
    while(!H.empty())
    {
        cs=-H.top().x;
        nod=H.top().y;
        H.pop();
        if(cs!=dist[nod])
            continue;
        for(auto i:v[nod])
            if(f[nod][i]<cap[nod][i])
            {
                int newd=dist[nod]+cost[nod][i]+old[nod]-old[i];
                if(newd<dist[i])
                {
                    dist[i]=newd;
                    pr[i]=nod;
                    H.push({-newd,i});
                    r[i]=r[nod]+cost[nod][i];
                }
            }
    }
     if(dist[d]==(1<<28))
        return 0;
    for(int i=1;i<=n;i++)
        old[i]=r[i];
    nod=d;
    int fmin=(1<<28);
    while(nod!=s)
    {
        fmin=min(fmin,cap[pr[nod]][nod]-f[pr[nod]][nod]);
        nod=pr[nod];
    }
    nod=d;
    while(nod!=s)
    {
        f[pr[nod]][nod]+=fmin;
        f[nod][pr[nod]]-=fmin;
        nod=pr[nod];
    }
    rez+=fmin*r[d];
    return 1;
}
void bf()
{
    int nod;
    q.push(s);
    inq[s]=1;
    for(int i=1;i<=n;i++)
        old[i]=(1<<28);
    old[s]=0;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        inq[nod]=0;
        for(auto i:v[nod])
            if(cap[nod][i]>f[nod][i]&&old[nod]+cost[nod][i]<old[i])
            {
                old[i]=old[nod]+cost[nod][i];
                if(inq[i]==0)
                {
                    inq[i]=1;
                    q.push(i);
                }
            }
    }
}
int main()
{
    fin>>n>>m>>s>>d;
    for(int i=1;i<=m;i++)
    {
        fin>>g>>h>>c>>z;
        cap[g][h]=c;
        cost[g][h]=z;
        cost[h][g]=-z;
        v[g].pb(h);
        v[h].pb(g);
    }
    bf();
    for(int i=1;i<=n;i++)
        dist[i]=(1<<28);
    while(dijkstra());
    fout<<rez;
}