Cod sursa(job #2902925)

Utilizator tiut_cristianTiut Cristian tiut_cristian Data 16 mai 2022 22:34:18
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.63 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("fmcm.in");
ofstream fout("fmcm.out");

const int INF=0x3F3F3F3F;
typedef pair<unsigned,int> PUI;
typedef pair<unsigned,unsigned> PUU;

vector<unsigned> Adj[351];

unsigned F[351][351];
int Cst[351][351];
int Dist[351];
int ndist[351];
unsigned tati[351];
int real_d[351];

priority_queue<PUU,vector<PUU>,greater<PUU> > pq;
bool enqueued[351];

void BellmanFord(const unsigned n, const unsigned s)
{
    queue<unsigned> q;
    q.push(s);
    while(!q.empty())
    {
        unsigned f=q.front(); q.pop(); enqueued[f]=false;
        for(auto it=Adj[f].begin();it!=Adj[f].end();++it)
            if(Dist[*it]>Dist[f]+Cst[f][*it]&&F[f][*it]!=0)
            {
                Dist[*it]=Dist[f]+Cst[f][*it];
                if(!enqueued[*it])
                    q.push(*it);
            }
    }
}

bool ameliorare_Dijkstra(int &cstmin, const unsigned &n, const unsigned &s, const unsigned &d)
{
    memset(ndist,0x3F,4*(n+1));
    memset(real_d,0x3F,4*(n+1));
    pq.push(PUU(0,s));
    ndist[s]=0; real_d[s]=0;

    while(!pq.empty())
    {
        int cdist=pq.top().first; unsigned cnod=pq.top().second;
        pq.pop();
        if(cdist==ndist[cnod])
            for(auto it=Adj[cnod].begin();it!=Adj[cnod].end();++it)
            {
                int temp;
                if( (F[cnod][*it]>0) && (ndist[*it] > (temp=cdist+Dist[cnod]-Dist[*it]+Cst[cnod][*it])) )
                {
                    ndist[*it]=temp;
                    pq.push(PUU(temp,*it));
                    tati[*it]=cnod;
                    real_d[*it]=real_d[cnod]+Cst[cnod][*it];
                }
            }
    }

    if(ndist[d]!=INF)//am gasit drum de ameliorare
    {
        unsigned cflux=INF;
        for(unsigned i=d;i!=s;i=tati[i])
            if(F[tati[i]][i]<cflux)
                cflux=F[tati[i]][i];

        for(unsigned i=d;i!=s;i=tati[i])
        {
            F[tati[i]][i]-=cflux;
            F[i][tati[i]]+=cflux;
        }
        cstmin+=cflux*real_d[d];
        memcpy(Dist,real_d,4*(n+1));
        return true;
    }
    return false;
}

int main()
{
    unsigned n, m, s, d;
    fin >> n >> m >> s >> d;
    memset(Dist,0x3F,4*(n+1));

    for(unsigned i=0;i<m;++i)
    {
        unsigned x, y, c;
        int z;
        fin >> x >> y >> c >> z;
        Adj[x].push_back(y);
        Adj[y].push_back(x);
        F[x][y]=c;
        Cst[x][y]=z;
        Cst[y][x]=-z;
    }
    Dist[s]=0;
    BellmanFord(n, s);

    int cstmin = 0;
    while(ameliorare_Dijkstra(cstmin, n, s, d))
        ;
    fout << cstmin;
}