Cod sursa(job #2447184)

Utilizator danielsociuSociu Daniel danielsociu Data 12 august 2019 12:54:37
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;
#define st first
#define nd second
#define pb push_back
#define mkp make_pair
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define FORS(i,a,b) for(int i=(a);i<(b);++i)
#define PII pair<int,int>
#define VI vector<int>
#define VPII vector<PII>
#define all(x) x.begin(),b.end()
#define SZ(x) ((int)(x).size())
#define ll long long
#define MOD 10000000 //998244353
#define maxn 355
const int INF=0x3f3f3f3f;

int N,M,S,D,cst[maxn][maxn],C[maxn][maxn],nod,mini,
TT[maxn],Cmin,d[maxn],cost,reald[maxn],old[maxn],inq[maxn];
VI g[maxn];
priority_queue<PII,VPII,greater<PII>>heap;

bool fmcm()
{
	FOR(i,1,N)d[i]=INF;
	d[S]=0;reald[S]=0;
	heap.push(mkp(d[S],S));
	while(!heap.empty())
	{
		cost=heap.top().st;
		nod=heap.top().nd;
		heap.pop();
		if(cost>d[nod]) continue;
		for(auto it:g[nod])
			if(C[nod][it]){
				int newc=d[nod]+cst[nod][it]+old[nod]-old[it];
				if(newc<d[it]){
					d[it]=newc;
					reald[it]=reald[nod]+cst[nod][it];
					TT[it]=nod;
					heap.push(mkp(newc,it));
				}
			}
	}
	memcpy(old,reald,sizeof(d));
	if(d[D]==INF)return 0;
	mini=INF;
	for(int u=D;u!=S;u=TT[u])
		mini=min(mini,C[TT[u]][u]);
	for(int u=D;u!=S;u=TT[u])
		C[TT[u]][u]-=mini,
		C[u][TT[u]]+=mini;
	Cmin+=(mini*reald[D]);
	return 1;
}

void bellman(){
	memset(old,INF,sizeof(old));
	queue<int> que;
	que.push(S);
	old[S]=0;
	while(!que.empty()){
		int nod=que.front();
		que.pop();
		inq[nod]=0;
		for(auto it:g[nod])
			if(C[nod][it]){
				int newv=old[nod]+cst[nod][it];
				if(old[it]>newv){
					old[it]=newv;
					if(!inq[it])inq[it]=1,que.push(it);
				}
		}
	}
}

int main()
{
//	clock_t tStart = clock();
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	int x,y,c,z;
	cin>>N>>M>>S>>D;
	FOR(i,1,M){
		cin>>x>>y>>c>>z;
		g[x].pb(y);
		g[y].pb(x);
		C[x][y]=c;
		cst[x][y]=z,cst[y][x]=-z;
	}
	bellman();
	for(;fmcm(););
	cout<<Cmin;
	//cout<< ((double)(clock() - tStart)/CLOCKS_PER_SEC);
}