Cod sursa(job #408773)

Utilizator hasegandaniHasegan Daniel hasegandani Data 3 martie 2010 10:59:12
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<stdio.h>
#include<vector>
#include<queue>

using namespace std;
#define Nmax 355
#define inf 0x3f3f3f3f
#define fst first
#define snd second

int N,M,S,D,F[Nmax][Nmax];
vector < pair<int,int> > l[Nmax];
int d[Nmax],v[Nmax],p[Nmax];

struct cmp
{
	bool operator()(int a,int b)
	{
		return (d[a] > d[b]);
	}
};
priority_queue <int, vector<int> ,cmp> Heap;

void init()
{
	for(int i=1;i<=N;++i)
	{
		d[i]=inf;
		p[i]=0;
		v[i]=0;
	}
	for(; !Heap.empty() ; Heap.pop() );
}

int dijkstra()
{
	init();
	d[S]=0;
	Heap.push(S);
	v[S]=1;
	
	int nod;
	for(; !Heap.empty() ;)
	{
		nod=Heap.top();
		v[nod]=0;
		Heap.pop();
		for(int i=0;i<(int)l[nod].size() ;++i)
			if (d[ l[nod][i].fst ] > d[nod] + l[nod][i].snd && F[nod][l[nod][i].fst])
			{
				d[ l[nod][i].fst ] = d[nod] + l[nod][i].snd;
				p[ l[nod][i].fst ] = nod;
				if (!v[ l[nod][i].fst ])
				{
					v[ l[nod][i].fst ]=1;
					Heap.push(l[nod][i].fst);
				}
			}
	}
	if (d[D]==inf)
		return 0;
	return 1;
}

void solve()
{
	int min,Cost=0;
	for( ; dijkstra() ; )
	{
		min=inf;
		for(int t=D; t!=S ;t=p[t])
			if (min > F[p[t]][t])
				min = F[p[t]][t];
		for(int t=D; t!=S ;t=p[t])
		{
			F[p[t]][t] -= min;
			F[t][p[t]] += min;
		}
		Cost += min*d[D];
	}
	printf("%d\n",Cost);
}

void cit();

int main()
{
	cit();
	solve();
	return 0;
}

void cit()
{
	int x,y,z,t;
	freopen("fmcm.in","r",stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%d %d %d %d",&N,&M,&S,&D);
	for(int i=1;i<=M;++i)
	{
		scanf("%d%d%d%d",&x,&y,&z,&t);
		F[x][y]=z;
		l[x].push_back( make_pair(y,t) );
		l[y].push_back( make_pair(x,-t) );
	}
}