Cod sursa(job #403508)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 25 februarie 2010 00:00:06
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define DIM 360
#define INF 1<<30
typedef pair <short int,short int> p;
short int C[DIM][DIM],F[DIM][DIM],T[DIM];
short int n,m,x,y,c,z;
short int START,END,nod,Rez;
int Flow;
vector <int> cost;
vector <bool> ut;
vector <p> g[DIM];
vector <p> ::iterator it;
struct cmp
{
	bool operator () (const short int &i,const short int &j) const
	{
		return cost[i]>cost[j];
	}
};
priority_queue <short int,vector <short int>,cmp> Q;
bool dijkstra()
{
	cost.clear();cost.resize(DIM,INF);
	ut.clear();ut.resize(DIM,0);
	for(cost[START]=0,Q.push(START);!Q.empty();)
	{
		int nod=Q.top();
		Q.pop(); ut[nod]=0;
		for(it=g[nod].begin();it!=g[nod].end();it++)
		{
			if(cost[it->first]<=cost[nod]+it->second)
				continue;
			if(C[nod][it->first]<=F[nod][it->first])
				continue;
			cost[it->first]=cost[nod]+it->second;
			T[it->first]=nod;
			if(ut[it->first])
				continue;
			ut[it->first]=1;
			Q.push(it->first);
		}
	}
	return cost[END]==INF?0:1;
}
int main()
{
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%hd%hd%hd%hd",&n,&m,&START,&END);
	for(int i=1;i<=m;i++)
	{
		scanf("%hd%hd%hd%hd",&x,&y,&c,&z);
		C[x][y]=c;
		g[x].push_back(p(y,z));
		g[y].push_back(p(x,-z));
	}
	while(dijkstra())
	{
		Flow=INF;
		for(nod=END;nod!=START;nod=T[nod])
			Flow=min(Flow,C[T[nod]][nod]-F[T[nod]][nod]);
		for(nod=END;nod!=START;nod=T[nod])
		{
			F[T[nod]][nod]+=Flow;
			F[nod][T[nod]]-=Flow;
		}
		Rez+=cost[END]*Flow;
	}
	printf("%d\n",Rez);
	return 0;
}