Cod sursa(job #2823363)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 28 decembrie 2021 11:52:06
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("fmcm.in");
ofstream out("fmcm.out");

using ll = long long;

const ll INF = (ll)1e18 + 5;

vector<vector<int>> g;

vector<vector<int>> cost, cap;

vector<ll> d, old;

vector<int> dad;

bool Dijkstra(int n, int sink, int dest) {
  vector<bool> seen(n + 1);
  vector<ll> newD(n + 1);
  seen[sink] = true;
  priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
  d[sink] = 0;
  q.push(make_pair(d[sink], sink));
  while ((int)q.size() > 0) {
    int u = q.top().second, c = q.top().first;
    q.pop();
    if (d[u] < c)
      continue;
    for (int v : g[u])
      if (cap[u][v]) {
        int newDistance = d[u] + cost[u][v] + old[u] - old[v];
        if (newDistance < d[v]) {
          d[v] = newDistance;
          newD[v] = newD[u] + cost[u][v];
          q.push(make_pair(d[v], v));
          dad[v] = u;
          seen[v] = true;
        }
      }
  }
  old = newD;
  return seen[dest];
}

int main()  {
  int n, m, sink, dest; in >> n >> m >> sink >> dest;
  cost.resize(n + 1, vector<int>(n + 1)); cap.resize(n + 1, vector<int>(n + 1));
  g.resize(n + 1);
  d.resize(n + 1, INF);
  old.resize(n + 1);
  dad.resize(n + 1, -1);
  for (int i = 0; i < m; i++) {
    int a, b, c, y; in >> a >> b >> c >> y;
    cost[a][b] = y;
    cost[b][a] = -y;
    cap[a][b] = c;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  ll flow = 0, flowCost = 0;
  while (Dijkstra(n, sink, dest)) {
    ll pump = INF;
    for (int u = dest; u != sink; u = dad[u]) 
      pump = min(pump, (ll)cap[dad[u]][u]);
    for (int u = dest; u != sink; u = dad[u]) {
      cap[dad[u]][u] -= pump;
      cap[u][dad[u]] += pump;
    }
    flow += pump;
    flowCost += pump * old[dest];
    fill(dad.begin(), dad.end(), -1);
    fill(d.begin(), d.end(), INF);
  }
  out << flowCost << "\n";
  return 0;
}