Cod sursa(job #243228)

Utilizator blasterzMircea Dima blasterz Data 12 ianuarie 2009 14:55:59
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <string>
#define N 351
#define oo 0x3f3f3f3f	

int cost[N][N], cap[N][N];

struct nod { int x; nod *n;};

nod *a[N];
int source, sink;
int n, m;

inline void add(int i, int j)
{
	nod *p=new nod;
	p->x=j;
	p->n=a[i];
	a[i]=p;
}

inline int bellman()
{
	int Q[512], p=0,q=0;
	int t[N], d[N];
	bool inq[N];
	memset(inq, 0, sizeof(inq));
	memset(t, 0, sizeof(t));
	memset(d, oo, sizeof(d));
	d[source]=0;
	Q[0]=source;
	inq[source]=0;
	int nr=1;
	int u;
	nod *i;
	
	while(nr)
	{
		u=Q[p];
		p=(p+1)&511;
		inq[u]=0;
		--nr;
		for(i = a[u]; i; i=i->n)
			if(cap[u][i->x] > 0)
				if(d[i->x] > d[u] + cost[u][i->x])
				{
					d[i->x]=d[u] + cost[u][i->x];
					t[i->x]=u;
					
					if(!inq[i->x])
					{
						q=(q+1)&511;
						Q[q]=i->x;
						++nr;
					}
				}
	}
	
	if(t[sink] == 0) return 0;
	
	int mn=oo;
	
	for(int i=sink; i != source; i=t[i])
		if(cap[t[i]][i] < mn) mn=cap[t[i]][i];
	
	for(int i=sink; i != source; i=t[i])
		cap[t[i]][i]-=mn,
		cap[i][t[i]]+=mn;
	
	return mn*d[sink];
	
}
void solve()
{
	int sol=0;
	while(1)
	{
		int t=bellman();
		if(t==0) break;
		sol+=t;
	}

	freopen("fmcm.out","w",stdout);
	printf("%d\n", sol);
	return ;
	
	for(int i=1; i<=n; ++i)
		for(nod *j=a[i]; j; j=j->n)
			if(cap[i][j->x] == 0) sol += cost[i][j->x];
		
	printf("%d\n", sol);
	
	
}


int main()
{
	freopen("fmcm.in","r",stdin);
	scanf("%d %d %d %d\n", &n, &m, &source, &sink);
	
	int p, q, capp, costt;
	while(m--)
	{
		scanf("%d %d %d %d\n", &p, &q, &capp, &costt);
		add(p,q);
		add(q,p);
		cap[p][q]=capp;
		cost[p][q]=costt;
		cost[q][p]=-costt;
	}

	solve();
	return 0;
}