Cod sursa(job #2873106)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 18 martie 2022 17:42:08
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.02 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
const int FIN=2000001;
int dist[500],heap[500],coord[500],nr;
void up(int k)
{
    if(k==1)
        return;
    if(dist[heap[k]]<dist[heap[k/2]])
    {
        swap(coord[heap[k]],coord[heap[k/2]]);
        swap(heap[k],heap[k/2]);
        up(k/2);
    }
}
void down(int k)
{
    int p=k*2;
    if(p>nr)
        return;
    if(p+1<=nr && dist[heap[p+1]]<dist[heap[p]])
        p++;
    if(dist[heap[k]]>dist[heap[p]])
    {
        swap(coord[heap[k]],coord[heap[p]]);
        swap(heap[k],heap[p]);
        down(p);
    }
}
vector <int> v[500];
bool inheap[500];
int old[500],real[500],s,d,cap[500][500],cost[500][500],ante[500],n;
bool dijkstra()
{
    for(int i=1;i<=n;i++)
        dist[i]=FIN;
    dist[s]=real[s]=0;
    nr++;
    heap[nr]=s;
    inheap[s]=1;
    while(nr)
    {
        int k=heap[1];
        heap[1]=heap[nr];
        inheap[k]=0;
        nr--;
        coord[heap[1]]=1;
        down(1);
        for(auto it=v[k].begin();it!=v[k].end();it++)
        {
            if(cap[k][*it]<=0)
                continue;
            int p=dist[k]+cost[k][*it]+old[k]-old[*it];
            if(p<dist[*it])
            {
                dist[*it]=p;
                real[*it]=real[k]+cost[k][*it];
                ante[*it]=k;
                if(inheap[*it]==0)
                {
                    nr++;
                    inheap[*it]=1;
                    heap[nr]=*it;
                    coord[*it]=nr;
                }
                up(coord[*it]);
            }
        }
    }
    return dist[d]!=FIN;
}
bool inq[500];
queue <int> q;
bool bellman_ford()
{
    for(int i=1;i<=n;i++)
        old[i]=FIN;
    old[s]=0;
    q.push(s);
    inq[s]=1;
    while(q.empty()==false)
    {
        int k=q.front();
        q.pop();
        inq[k]=0;
        for(auto it=v[k].begin();it!=v[k].end();it++)
        {
            if(cap[k][*it]<=0)
                continue;
            if(old[k]+cost[k][*it]>=old[*it])
                continue;
            old[*it]=old[k]+cost[k][*it];
            if(inq[*it]==0)
            {
                q.push(*it);
                inq[*it]=1;
            }
        }
    }
    return old[d]!=FIN;
}
int m,i,x,y,z,t,M,sol;
int main()
{
    f>>n>>m>>s>>d;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z>>t;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y]=z;
        cost[x][y]=t;
        cost[y][x]=-t;
    }
    if(bellman_ford()==0)
    {
        g<<-1;
        return 0;
    }
    while(dijkstra()==1)
    {
        memcpy(old,real,sizeof(dist));
        M=FIN;
        for(i=d;i!=s;i=ante[i])
            M=min(M,cap[ante[i]][i]);
        sol=sol+M*real[d];
        for(i=d;i!=s;i=ante[i])
        {
            cap[ante[i]][i]=cap[ante[i]][i]-M;
            cap[i][ante[i]]=cap[i][ante[i]]+M;
        }
    }
    g<<sol;
    return 0;
}