Cod sursa(job #1748057)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 26 august 2016 00:51:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <set>
#include <algorithm>
#include <iomanip>
#include <string>
#define pb push_back
#define NMAX 355
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef pair<int, int> pii;

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

vector<int> v[NMAX];
int cap[NMAX][NMAX], flux[NMAX][NMAX], cost[NMAX][NMAX], costmin[NMAX], p[NMAX];
bool viz[NMAX];

int main () {
	int n,m,s,d,i,x,y,c,e,ok=1,fmin,sol=0;

	fin>>n>>m>>s>>d;

	for(i=0;i<m;++i) {
		fin>>x>>y>>c>>e;
		cap[x][y]=c;
		cost[x][y]=e;
		cost[y][x]=-e;
		v[x].pb(y);
		v[y].pb(x);
	}

	do {
		for(i=1;i<=n;++i) costmin[i]=INF;

		costmin[s]=0;
		queue<int> Q;
		Q.push(s);
		viz[s]=1;

		while(!Q.empty()) {
			x=Q.front();
			c=costmin[x];
			Q.pop();
			viz[x]=0;

			for(auto y:v[x]) {
				if(flux[x][y] < cap[x][y] && c+cost[x][y]<costmin[y]) {
					costmin[y]=cost[x][y]+c;
					p[y]=x;
					if(!viz[y]) {
						viz[y]=1;
						Q.push(y);
					}
				}
			}
		}

		if(costmin[d]==INF) ok=0;

		if(ok) {
			fmin=INF;

			x=d;
			while(x!=s) {
				fmin=min(fmin,cap[p[x]][x]-flux[p[x]][x]);
				x=p[x];
			}

			x=d;
			while(x!=s) {
				flux[p[x]][x]+=fmin;
				flux[x][p[x]]-=fmin;
				x=p[x];
			}
			sol+=fmin*costmin[d];
		}
	} while(ok);

	fout<<sol;

	return 0;
}