Cod sursa(job #2961274)

Utilizator razvan1403razvan razvan1403 Data 6 ianuarie 2023 02:38:30
Problema Flux maxim de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define dim 400
#define inf INT_MAX
using namespace std;

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

short int n,m,s,d;
short int x,y,c,z, nodCurent;
short int capacitate[dim][dim];
short int flux[dim][dim];
short int nod_flux[dim];
vector<pair<short int, short int>> graf[dim]; 
vector<int> cost;
vector<bool> vizitat;
int flowCurent;
int total = 0;
vector<pair<short int, short int>> ::iterator it;

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

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

bool dijkstra()
{
	cost.clear();cost.resize(dim,inf);
	vizitat.clear();vizitat.resize(dim,0);
  cost[s]=0;
  pq.push(s);
	while(!pq.empty())
	{
		int nod=pq.top();
		pq.pop(); 
    vizitat[nod]=0;
		for(it=graf[nod].begin();it!=graf[nod].end();it++)
		{
			if(cost[it->first]<=cost[nod]+it->second)
				continue;
			if(capacitate[nod][it->first]<=flux[nod][it->first])
				continue;
			cost[it->first]=cost[nod]+it->second;
			nod_flux[it->first]=nod;
			if(vizitat[it->first])
				continue;
			vizitat[it->first]=1;
			pq.push(it->first);
		}
	}
	return cost[d]==inf?0:1;
}
int main() 
{
  ios_base::sync_with_stdio(0), fin.tie(0), fout.tie(0);
  fin>>n>>m>>s>>d;
  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;
  }
  while(dijkstra()){
    flowCurent = inf;
    for(nodCurent = d; nodCurent != s; nodCurent = nod_flux[nodCurent]){
        flowCurent = min(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;
  fin.close();
  fout.close();

  return 0;
}