Cod sursa(job #302042)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 8 aprilie 2009 17:04:02
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>

#define N 800000
#define INF 2000000000

int sol, n, m, i, s, d, u, w, *v, cp;
int fl, cs, cu, cm[351], first, last;
int co[N], mark[351], dad[351], vec[351][351], gr[351];
short int c[351][351], C[351][351];

void flux()
{
	for(;;)
	{
		for(i = 1; i <= n; i++) cm[i] = INF;

		cm[s] = 0; first = last = 1; co[1] = s; mark[s] = 1;

		while(first <= last)
		{
			u = co[first++]; 
			cu = cm[u];
			mark[u] = 0;

			for(v = vec[u]; *v; v++)
				if(c[u][*v] && cu + C[u][*v] < cm[*v])
				{
					cm[*v] = cu + C[u][*v];
					dad[*v] = u;
					if(!mark[*v]) 
					{ 
						mark[*v] = 1; co[++last] = *v;
					}					
				}
		}

		if(cm[d] == INF) return;
		fl = INF;
		for(u = d; u != s; u = dad[u]) fl = (fl < c[dad[u]][u]) ? fl : c[dad[u]][u];
		for(u = d; u != s; u = dad[u])
		{
			c[dad[u]][u] -= fl;
			c[u][dad[u]] += fl;
		}
		sol += fl * cm[d];
	}
}

int main()
{
	v = new int;
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out","w",stdout);
	scanf("%d %d %d %d", &n, &m, &s, &d);

	for(i = 1; i <= m; i++)
	{
		scanf("%d %d %d %d", &u, &w, &cp, &cs);
		c[u][w] = cp; 
		C[u][w] = cs; 
		C[w][u] = -cs;
		vec[u][gr[u]++] = w;
		vec[w][gr[w]++] = u;
	}
	flux();
	printf("%d\n",sol);
	return 0;
}