Cod sursa(job #2877120)

Utilizator darisavuSavu Daria darisavu Data 24 martie 2022 10:11:18
Problema Flux maxim de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int di[355],dist[355],dist2[355],cost[355][355],C[355][355],F[355][355],n,m,s,d,x,y,c,z,tata[355],sol,FC,viz[355];
priority_queue<pair<int,int>, vector<pair<int,int> >, greater< pair<int,int> > >h;
vector<int>v[355];
int dijkstra()
{
    int nod,i,vec,cst;
    for(i=1; i<=n; i++)
    {
        tata[i]=0;
        di[i]=inf;
    }
    h.push({0,s});
    di[s]=dist2[s]=0;
    tata[s]=-1;
    while(!h.empty())
    {
        cst=h.top().first;
        nod=h.top().second;
        h.pop();
        if(cst!=di[nod] || nod==d) continue;
        for(i=0; i<v[nod].size(); i++)
        {
            vec=v[nod][i];
                if(di[vec]>cst+cost[nod][vec]+dist[nod]-dist[vec]&&C[nod][vec]>F[nod][vec])
                {
                    tata[vec]=nod;
                    di[vec]=cst+cost[nod][vec]+dist[nod]-dist[vec];
                    dist2[vec]=dist2[nod]+cost[nod][vec];
                    h.push({di[vec],vec});
                }
        }
    }
    for(int i=1; i<=n; i++) dist[i]=dist2[i];
    if(tata[d]) return 1;
    return 0;

}
void bellmanford()
{
    int i,nod,cst,vec;
    for(i=1;i<=n;i++) dist[i]=inf;
    dist[s]=0;
    viz[s]=1;
    queue<int>q;
    q.push(s);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        viz[nod]=0;
        for(i=0;i<v[nod].size();i++)
        {
            vec=v[nod][i];
            cst=cost[nod][vec];
            if(dist[vec]>cst+dist[nod]&&C[nod][vec]>F[nod][vec])
            {
                dist[vec]=cst+dist[nod];
                if(vec!=d&&!viz[vec]) {viz[vec]=1;q.push(vec);}
            }
        }
    }
}
int main()
{
    int i;
    f>>n>>m>>s>>d;
    for(i=1; i<=m; i++)
    {
        f>>x>>y>>c>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=c;
        cost[x][y]=z;
        cost[y][z]=-z;
    }
    bellmanford();

    while(dijkstra())
    {
        g<<'\n';
        FC=inf;
        for(i=d; i!=s; i=tata[i]) FC=min(FC,C[tata[i]][i]-F[tata[i]][i]);
        for(i=d; i!=s; i=tata[i])
        {
            F[tata[i]][i]+=FC;
            F[i][tata[i]]-=FC;
            sol+=FC*cost[tata[i]][i];
        }
    }
    g<<sol;
    return 0;
}