Cod sursa(job #3137522)

Utilizator proflaurianPanaete Adrian proflaurian Data 13 iunie 2023 10:13:47
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
const int N = 360;
const int oo = 1000000000;
int n,m,S,D,flux,costFlux,cap[N][N],cst[N][N],oldCst[N],pozCst[N],realCst[N],T[N];
vector<int> v[N];
bitset<N> inQ;
queue<int> Q;
priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>>pq;
inline bool dijkstra()
{
    fill(pozCst+1,pozCst+n+1,oo);
    pozCst[S]=realCst[S]=0;T[S]=S;
    pq.push(make_pair(0, S));
    for (;pq.size();)
    {
        int pozCstNod,nod,pozCstVec;
        tie(pozCstNod,nod)=pq.top();pq.pop();
        if (pozCst[nod] != pozCstNod)
            continue;
        for (auto vec:v[nod])
            if (cap[nod][vec]&&(pozCstVec=pozCstNod+cst[nod][vec]+oldCst[nod]-oldCst[vec])<pozCst[vec])
            {

                    pozCst[vec]=pozCstVec;
                    realCst[vec]=realCst[nod]+cst[nod][vec];
                    T[vec]=nod;
                    pq.push(make_pair(pozCst[vec],vec));
            }
    }
    memcpy(oldCst,realCst, sizeof(pozCst));
    if (pozCst[D]==oo)return false;
    int fluxDrum=oo,costDrum = 0;
    for (int x=T[D],y=D;y!=S;x=T[x],y=T[y])fluxDrum=min(fluxDrum,cap[x][y]),costDrum+=cst[x][y];
    flux+=fluxDrum;costFlux+=fluxDrum*realCst[D];
    for (int x=T[D],y=D;y!= S;x=T[x],y=T[y])cap[x][y]-=fluxDrum,cap[y][x]+=fluxDrum;
    return true;
}
inline bool bellmanFord()
{

    fill(oldCst+1,oldCst+n+1,oo);oldCst[S] = 0;
    for (Q.push(S), inQ[S] = 1;Q.size(); Q.pop())
    {
        int nod = Q.front();inQ[nod] = 0;
        for (auto vec:v[nod])
            if (cap[nod][vec])
                if (oldCst[vec]<oldCst[nod]+cst[nod][vec])
                {
                    oldCst[vec] = oldCst[nod] + cst[nod][vec];
                    if (!inQ[vec]){inQ[vec]=1;Q.push(vec);}
                }
    }
    return oldCst[D]!=oo;
}
int main()
{
    f>>n>>m>>S>>D;
    for(;m;m--)
    {
        int x, y;
        f>>x>>y;v[x].push_back(y);v[y].push_back(x);
        f>>cap[x][y]>>cst[x][y];cst[y][x]=-cst[x][y];
    }
    flux=costFlux=0;
    bellmanFord();
    while(dijkstra());
    g<<costFlux;
    return 0;
}