Cod sursa(job #2961265)

Utilizator razvan1403razvan razvan1403 Data 6 ianuarie 2023 01:57:12
Problema Flux maxim de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.47 kb
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii; 
#define modulo 1000000007
#define FOR(i,a,b) for(int i=a;i<=b;i++)
typedef vector<pii> vpii;

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

int n,m,s,d;
int x,y,c,z;
vector<vector<int>>capacitate;
vector<vector<int>>flux;
vector<int> nod_flux;
vector<vector<pii>> graf; 
vector<int> cost;
vector<int> vizitat;
int flowCurent, nodCurent;
int total = 0;

struct cmp{
 bool operator() (int &a, int &b){
  return cost[a] < cost[b];
 }
};

priority_queue<int, vector<int>, cmp> pq;

int dijkstra(){
  cost = vector<int> (n+1, INT_MAX);
  vizitat = vector<int> (n+1, 0);
  pq.push(s);
  cost[s] = 0;

  while(!pq.empty()){
    int nodCurent = pq.top();
    pq.pop();
    vizitat[nodCurent] = 0;
    for(int i = 0;i<graf[nodCurent].size();i++){
      int nod = graf[nodCurent][i].first;
      int costCurent = graf[nodCurent][i].second;
      if(cost[nod] <= cost[nodCurent] + costCurent)
        continue;
      if(capacitate[nodCurent][nod] <= flux[nodCurent][nod])
        continue;
      cost[nod] = cost[nodCurent] + costCurent;
      nod_flux[nod] = nodCurent;
      if(vizitat[nod] == 1)
        continue;
      vizitat[nod] = 1;
      pq.push(nod);
    }
  }
  if(cost[d] == INT_MAX)
    return 0;
  return 1;
}

void solve(){
  while(dijkstra()){
    flowCurent = INT_MAX;
    for(nodCurent = d; nodCurent != s; nodCurent = nod_flux[nodCurent]){
      if(capacitate[nod_flux[nodCurent]][nodCurent] - flux[nod_flux[nodCurent]][nodCurent] < flowCurent)
        flowCurent = capacitate[nod_flux[nodCurent]][nodCurent] - flux[nod_flux[nodCurent]][nodCurent];
    }
    for(nodCurent = d; nodCurent != s; nodCurent = nod_flux[nodCurent]){
     flux[nod_flux[nodCurent]][nodCurent] += flowCurent;
     flux[nodCurent][nod_flux[nodCurent]] -= flowCurent;
    }
    total = total + flowCurent * cost[d];
  }
  fout<<total<<endl;
}

void read(){
  fin>>n>>m>>s>>d;
  graf = vector<vector<pii>>(n+1);
  capacitate = vector<vector<int>> (n+1, vector<int>(n+1, 0));
  flux = vector<vector<int>> (n+1, vector<int>(n+1, 0));
  nod_flux = vector<int> (n+1, 0);
  
  for(int i=1;i<=m;i++){
    fin>>x>>y>>c>>z;
    graf[x].push_back(make_pair(y,z));
    graf[y].push_back(make_pair(x,-z));
    capacitate[x][y] = c;
  }
  solve();
}

int main() 
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int t = 1;

  while(t--){
    read();
  }

  return 0;
}