Cod sursa(job #2897163)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 2 mai 2022 18:30:39
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.78 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in ("fmcm.in");
ofstream out ("fmcm.out");
const int N=350;
const int INF=1000000000;
vector<int>ed[N+1];
int r[N+3][N+3],dist[N+3],cost[N+3][N+3],init_dist[N+3],init_cost[N+3][N+3],inQ[N+3],prv[N+3];
void bellman (int S)
{
    queue<int>q;
    q.push(S);
    for(int i=1;i<=N;++i)
        init_dist[i]=INF;
    init_dist[S]=0;
    inQ[S]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        inQ[nod]=0;
        for(int nn : ed[nod])
        {
            if(!r[nod][nn])
                continue;
            if(init_dist[nod]+init_cost[nod][nn]<init_dist[nn])
            {
                init_dist[nn]=init_dist[nod]+init_cost[nod][nn];
                if(!inQ[nn])
                {
                    inQ[nn]=1;
                    q.push(nn);
                }
            }
        }
    }
    for(int i=1;i<=N;++i)
        for(int nn : ed[i])
            cost[i][nn]=init_cost[i][nn] + init_dist[i] - init_dist[nn];
}
pair<int,int> dijkstra (int S, int D)
{
    priority_queue<pair<int,int> >q;
    for(int i=1;i<=N;++i)
        dist[i]=INF;
    dist[S]=0;
    q.push(make_pair(0,S));
    while(!q.empty())
    {
        int nod=q.top().second,distc=-q.top().first;
        q.pop();
        if(dist[nod]<distc)
            continue;
        for(int nn : ed[nod])
        {
            if(!r[nod][nn])
                continue;
            if(dist[nod]+cost[nod][nn] < dist[nn])
            {
                dist[nn] = dist[nod]+cost[nod][nn];
                prv[nn]=nod;
                q.push(make_pair(-dist[nn],nn));
            }
        }
    }
    if(dist[D]==INF)
        return make_pair(0,0);
    int mn=INF,cst=0,pz=D;
    while(pz!=S)
    {
        mn=min(mn,r[prv[pz]][pz]);
        cst+=cost[prv[pz]][pz];
        pz=prv[pz];
    }
    pz=D;
    cst=mn*(cst+init_dist[D]);
    while(pz!=S)
    {
        r[prv[pz]][pz]-=mn;
        r[pz][prv[pz]]+=mn;
        pz=prv[pz];
    }
    return make_pair(mn,cst);
}
pair<int,int> mcmf (int S, int D)
{
    bellman(S);
    int F=0,C=0;
    pair<int,int>a=dijkstra(S,D);
    while(a!=make_pair(0,0))
    {
        F+=a.first;
        C+=a.second;
        a=dijkstra(S,D);
    }
    return make_pair(F,C);
}
void add_edge(int x, int y, int cap, int cst)
{
    r[x][y]+=cap;
    init_cost[x][y]+=cst;
    init_cost[y][x]-=cst;
    ed[x].push_back(y);
    ed[y].push_back(x);
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    long long t,i,k,s,d,m,j=0,tt,p,n,K;
    in>>n>>m>>s>>d;
    while(m--)
    {
        int x,y,c,z;
        in>>x>>y>>c>>z;
        add_edge(x,y,c,z);
    }
    pair<int,int>a=mcmf(s,d);
    out<<a.second;
    return 0;
}