Cod sursa(job #2124552)

Utilizator DavidDragulinDragulin David DavidDragulin Data 7 februarie 2018 12:50:24
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;
#define nmax 1001
#define inf INT_MAX
#define mp make_pair
#define s second
#define f first
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector <int> v[nmax];
int t[nmax],c[nmax][nmax],f[nmax][nmax],fc,fl,n,m,i,x,y,cs,j,z[nmax][nmax],d[nmax],s,de,cz,cc,cl,sl;
int dijkstra()
{
    int nod,i;
    priority_queue <pair<int,int> ,vector < pair <int,int> > ,greater <pair <int,int> > > h;
    memset(t,0,sizeof(t));
    t[s]=-1;
    h.push(mp(0,s));
    d[s]=0;
    for(i=1; i<=n; i++)
        if(i!=s)
            d[i]=inf;
    while(!h.empty())
    {
        nod=h.top().s;
        h.pop();
        for(i=0; i<v[nod].size(); i++)
        {
            if(t[v[nod][i]] || c[nod][v[nod][i]]==f[nod][v[nod][i]])
                continue;
            if(d[nod]+z[nod][i]<d[v[nod][i]])
            {
                d[v[nod][i]]=d[nod]+z[nod][i];
                t[v[nod][i]]=nod;
                if(v[nod][i]==de)
                    continue;
                h.push(mp(d[v[nod][i]],v[nod][i]));
            }
        }
    }
    if(t[de]!=0)
        return 1;
    return 0;
}
int main()
{
    fin>>n>>m>>s>>de;
    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>cs>>cz;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=cs;
        z[y][x]=-cz;
        z[x][y]=cz;
    }
    while(dijkstra())
    {
        cc=0;
        fc=0;
        if(!t[de])
                continue;
       for(i=0; i<v[de].size(); i++)
        {
            int i2=v[de][i];
            if(!t[i2]||c[i2][de]==f[i2][de])
                continue;
            t[de]=i2;
            fc=1e9;
            cc=0;
            for(j=de; j!=s; j=t[j])
                fc=min(fc,c[t[j]][j]-f[t[j]][j]);
            if(!fc)
                continue;
            for(j=de; j!=s; j=t[j])
            {
                f[t[j]][j]+=fc;
                f[j][t[j]]-=fc;
                cc+=z[t[j]][j];
            }
            sl+=cc*fc;
        }
    }
    fout<<sl-2;
    return 0;
}