Cod sursa(job #850981)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 9 ianuarie 2013 12:01:04
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

const int N = 350;
const int inf  = 1000000000;

int n, m, s, d, c[N][N], cost[N][N], flux, costt, odist[N], dist[N], ndist[N], p[N];
queue<int> q;
vector<int> v[N];
bool ver[N];
priority_queue<pair<int, int> > h;

bool dijkstra() {
	int i, tt;
	
	for(i = 1; i<=n; ++i)
		dist[i] = inf;
	dist[s] = 0; ndist[s] = 0;
	
	h.push(pair<int, int>(-dist[s], s));
	
	while(!h.empty()) {
		int cst = -h.top().first, nod = h.top().second;
		h.pop();
		
		if(dist[nod] != cst)
			continue;
		
		for(vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)
			if(c[nod][*it]) {
				tt = dist[nod] + cost[nod][*it] + odist[nod] - odist[*it];
				
				if(tt < dist[*it]) {
					dist[*it] = tt;
					ndist[*it] = ndist[nod] + cost[nod][*it];
					
					p[*it] = nod;
					h.push(pair<int, int>(-dist[*it], *it));
				}
			}
	}
	
	for(i = 1; i<=n; ++i)
		odist[i] = ndist[i];
	
	if(dist[d] == inf)
		return 0;
	return 1;
}

void bf() {
	int i;
	for(i = 1; i <= n; ++i)
		odist[i] = inf;
	odist[s] = 0;
	q.push(s);
	ver[s] = 1;
	
	while(!q.empty()) {
		int el = q.front();
		q.pop();
		ver[el] = 0;
		
		for(vector<int>::iterator it = v[el].begin(); it != v[el].end(); ++it)
			if(c[el][*it] && odist[el] + cost[el][*it] < odist[*it]) {
				odist[*it] = odist[el] + cost[el][*it];
				
				if(!ver[*it]) {
					ver[*it] = 1;
					q.push(*it);
				}
			}
	}
}

int main() {
	int i, a, b, cc, dd, smin, ccost;
	
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	
	cin >> n >> m >> s >> d;
	
	for(i = 1; i<=m; ++i) {
		scanf("%d%d%d%d", &a, &b, &cc, &dd);
		
		v[a].push_back(b);
		v[b].push_back(a);
		
		c[a][b] += cc;
		
		cost[a][b] = dd;
		cost[b][a] = -dd;
	}
	
	bf();
	
	flux = costt = 0;
	
	while(dijkstra()) {
		
		smin = inf, ccost = 0;
		for(i = d; i != s; i = p[i]) {
			smin = min(smin, c[p[i]][i]);
			ccost += cost[p[i]][i];
		}
 
		flux += smin;
		costt += smin * ndist[d];
		for(i = d; i != s; i = p[i])
			c[p[i]][i] -= smin,
			c[i][p[i]] += smin;
		}
	
	cout << costt;
	
	return 0;
}