Cod sursa(job #3143044)

Utilizator alexddAlexandru Dima alexdd Data 27 iulie 2023 12:39:04
Problema Flux maxim de cost minim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 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<pair<int,int>> con[355];
int capacity[355][355];
int prec[355];
int dist[355];
pair<int,int> bfs()
{
    for(int i=1;i<=n;i++)
    {
        dist[i]=INF;
        prec[i]=0;
    }
    prec[s]=-1;
    dist[s]=0;
    priority_queue<pair<int,pair<int,int>>> pq;
    pq.push({0,{INF,s}});
    while(!pq.empty())
    {
        int cost = -pq.top().first;
        int flow = pq.top().second.first;
        int nod = pq.top().second.second;
        pq.pop();
        if(cost!=dist[nod])
            continue;
        if(nod==d)
            return {flow,cost};
        for(auto adj:con[nod])
        {
            if(dist[adj.first]>dist[nod]+adj.second && capacity[nod][adj.first]>0)
            {
                prec[adj.first]=nod;
                dist[adj.first]=dist[nod]+adj.second;
                pq.push({-dist[adj.first],{min(flow,capacity[nod][adj.first]),adj.first}});
            }
        }
    }
    return {0,0};
}
pair<int,int> maxflow_mincost()
{
    int flow=0,cost=0;
    while(1)
    {
        pair<int,int> x = bfs();
        if(x.first==0)
            break;
        int cur=d;
        while(cur!=s)
        {
            capacity[prec[cur]][cur]-=x.first;
            capacity[cur][prec[cur]]+=x.first;
            cur=prec[cur];
        }
        flow+=x.first;
        cost+=x.second*x.first;
    }
    return {flow,cost};
}
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,z});
        con[y].push_back({x,-z});
        capacity[x][y]=c;
    }
    fout<<maxflow_mincost().second;
    return 0;
}