Cod sursa(job #2877122)

Utilizator darisavuSavu Daria darisavu Data 24 martie 2022 10:13:39
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
#define INF 0x3f3f3f3f
vector <int> v[354];
int n,m,start,finish,x,y,c,z,cost[354][354],cap[354][354],d[352],dist1[352],dist2[352],t[352],sol;
priority_queue <pair<int,int>,vector <pair<int,int>>, greater<pair<int,int>>> q;
bool flux()
{
    memset(d,INF,sizeof(d));
    d[start]=0;
    dist2[start]=0;
    q.push({d[start],start});
    while(!q.empty())
    {
        int nod=q.top().second;
        int cst=q.top().first;
        q.pop();
        if(cst>d[nod])continue;
        for(auto x:v[nod])
        {
            if(cap[nod][x])
            {
                if(d[x]>d[nod]+cost[nod][x]+dist1[nod]-dist1[x])
                {
                    d[x]=d[nod]+cost[nod][x]+dist1[nod]-dist1[x];
                    dist2[x]=dist2[nod]+cost[nod][x];
                    t[x]=nod;
                    q.push({d[x],x});
                }
            }
        }
    }
    memcpy(dist1,dist2,sizeof(d));
    if(d[finish]==INF)return 0;
    int min1=INF;
    for(int i=finish; i!=start; i=t[i])min1=min(min1,cap[t[i]][i]);
    for(int i=finish; i!=start; i=t[i])
    {
        cap[t[i]][i]-=min1;
        cap[i][t[i]]+=min1;
    }
    sol+=(min1*dist2[finish]);
    return 1;
}
int main()
{
    fin>>n>>m>>start>>finish;
    for(int i=1; i<=m; i++)
    {
        fin>>x>>y>>c>>z;
        v[x].push_back(y);
        v[y].push_back(x);
        cost[x][y]=z;
        cost[y][x]=-z;
        cap[x][y]=c;
    }
    while(flux());
    fout<<sol;
    return 0;
}