Cod sursa(job #3143054)

Utilizator alexddAlexandru Dima alexdd Data 27 iulie 2023 13:15:46
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int INF = 1e9;
int n,m,s,d;
vector<int> con[355];
int capacity[355][355];
int prec[355];
int cost[355][355];
int prec_dist[355];
int dist[355];
int cor_dist[355];
void calc_init()
{
    deque<int> dq;
    for(int i=1;i<=n;i++)
        prec_dist[i]=INF;
    prec_dist[s]=0;
    dq.push_back(s);
    while(!dq.empty())
    {
        int nod = dq.front();
        dq.pop_front();
        for(auto adj:con[nod])
        {
            if(capacity[nod][adj]>0 && prec_dist[adj]>prec_dist[nod]+cost[nod][adj])
            {
                prec_dist[adj]=prec_dist[nod]+cost[nod][adj];
                dq.push_back(adj);
            }
        }
    }
}
void bfs()
{
    priority_queue<pair<int,int>> pq;
    for(int i=1;i<=n;i++)
        dist[i]=INF,cor_dist[i]=INF;
    dist[s]=0;
    cor_dist[s]=0;
    pq.push({0,s});
    while(!pq.empty())
    {
        int nod = pq.top().second;
        int cdist = -pq.top().first;
        pq.pop();
        if(cdist!=dist[nod])
            continue;
        for(auto adj:con[nod])
        {
            if(capacity[nod][adj]>0 && dist[adj]>dist[nod]+cost[nod][adj]+prec_dist[nod]-prec_dist[adj])
            {
                prec[adj]=nod;
                dist[adj]=dist[nod]+cost[nod][adj]+prec_dist[nod]-prec_dist[adj];
                cor_dist[adj]=cor_dist[nod]+cost[nod][adj];
                pq.push({-dist[adj],adj});
            }
        }
    }
    for(int i=1;i<=n;i++)
        prec_dist[i]=cor_dist[i];
}
pair<int,int> maxflow_mincost()
{
    calc_init();
    int flow=0,mincost=0;
    while(1)
    {
        bfs();
        if(cor_dist[d]==INF)
            break;
        int cur=d,cflow=INF;
        while(cur!=s)
        {
            cflow=min(cflow,capacity[prec[cur]][cur]);
            cur=prec[cur];
        }
        cur=d;
        while(cur!=s)
        {
            capacity[prec[cur]][cur]-=cflow;
            capacity[cur][prec[cur]]+=cflow;
            cur=prec[cur];
        }
        flow+=cflow;
        mincost+=cor_dist[d]*cflow;
    }
    return {flow,mincost};
}
signed main()
{
    fin>>n>>m>>s>>d;
    int x,y,c,z;
    for(int i=0;i<m;i++)
    {
        fin>>x>>y>>c>>z;
        con[x].push_back(y);
        con[y].push_back(x);
        cost[x][y]=z;
        cost[y][x]=-z;
        capacity[x][y]=c;
    }
    fout<<maxflow_mincost().second;
    return 0;
}