Cod sursa(job #2447492)

Utilizator CharacterMeCharacter Me CharacterMe Data 13 august 2019 14:56:17
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>
#define pii pair<int, int>
#define inf 2147483647
///N=350 nr de noduri
///M=12500 nr de arce
///1<=c<=10000 flux pe muchie
///-10000<=z<=10000 cost pe muchie
using namespace std;
int n, m, s, d, i, j, k, out;
int last[351], maxflow[351][351], cost[351][351], flow[351][351];
int dmin[351], past[351], now[351];
vector<int> graph[351];
priority_queue<pii, vector<pii>, greater<pii> > pq;
///
void read();
void solve();
void write();
bool dij();
int main()
{
    read();
    solve();
    write();
    return 0;
}
void read(){
    freopen("fmcm.in", "r", stdin);
    scanf("%d%d%d%d", &n, &m, &s, &d);
    for(i=1; i<=m; ++i){
        int x, y, z, c;
        scanf("%d%d%d%d", &x, &y, &z, &c);
        maxflow[x][y]=z;
        cost[x][y]=c;
        cost[y][x]=-c;
        graph[x].push_back(y);
        graph[y].push_back(x);
    }
    return;
}
void solve(){
    while(dij()){
        int node, fm=inf;
        for(node=d; node!=s; node=last[node]) fm=min(fm, maxflow[last[node]][node]-flow[last[node]][node]);
        for(node=d; node!=s; node=last[node]){
            flow[last[node]][node]+=fm;
            flow[node][last[node]]-=fm;
        }
        out=out+fm*now[d];
    }
    return;
}
void write(){
    freopen("fmcm.out", "w", stdout);
    printf("%d", out);
    return;
}
bool dij(){
    for(i=1; i<=n; ++i) last[i]=0, dmin[i]=inf;
    now[s]=dmin[s]=0;
    pq.push({0, s});
    while(!pq.empty()){
        pii node=pq.top(); pq.pop();
        if(node.first>dmin[node.second]) continue;
        for(auto next:graph[node.second]){
            if(flow[node.second][next]==maxflow[node.second][next]) continue;
            int nowcost=cost[node.second][next]+dmin[node.second]+past[node.second]-past[next];
            if(nowcost<dmin[next]){
                dmin[next]=nowcost;
                now[next]=cost[node.second][next]+now[node.second];
                pq.push({dmin[next], next});
                last[next]=node.second;
            }
        }
    }
    for(i=1; i<=n; ++i) past[i]=now[i];
    return dmin[d]!=inf;
}