Cod sursa(job #930012)

Utilizator crushackPopescu Silviu crushack Data 27 martie 2013 13:22:54
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMax 350
#define oo 0x3f3f3f3f
using namespace std;

const char IN[]="fmcm.in",OUT[]="fmcm.out";

int N,M,S,D;
int C[NMax][NMax],F[NMax][NMax],Cost[NMax][NMax],P[NMax],T[NMax];
vector<int> ad[NMax];

bool bellman(){

	int x,i;
	static queue<int> qu;
	static bool b[NMax];

	memset(b,0,sizeof(b));
	memset(T,0x3f,sizeof(T));
	memset(P,0,sizeof(P));
	qu.push(S);b[S]=true;T[S]=0;

	while (!qu.empty()){
		x=qu.front();qu.pop();

		for (i=0;i<(int)ad[x].size();++i) if (C[x][ad[x][i]]>F[x][ad[x][i]] && T[x]+Cost[x][ad[x][i]]<T[ad[x][i]]){
			T[ad[x][i]]=T[x]+Cost[x][ad[x][i]];
			P[ad[x][i]]=x;
			if (!b[ad[x][i]]){
				b[ad[x][i]]=true;
				qu.push(ad[x][i]);
			}
		}
		b[x]=false;
	}
	return T[D]!=oo;
}

int flux()
{
	int p,fmin,ret=0;
	for (;bellman();)
	{
		fmin=oo;
		for (p=D;p!=S;p=P[p])
			fmin=min(fmin,C[P[p]][p]-F[P[p]][p]);

		ret+=T[D]*fmin;

		for (p=D;p!=S;p=P[p])
			F[P[p]][p]+=fmin,
			F[p][P[p]]-=fmin;
	}
	return ret;
}

int main()
{
	int i,x,y,c,cost;
	freopen(IN,"r",stdin);
	scanf("%d%d%d%d",&N,&M,&S,&D);
	for (i=1;i<=M;++i){
		scanf("%d%d%d%d",&x,&y,&c,&cost);

		Cost[x][y]+=cost;
		Cost[y][x]-=cost;
		C[x][y]+=c;

		ad[x].push_back(y);
		ad[y].push_back(x);
	}

	freopen(OUT,"w",stdout);
	printf("%d\n",flux());
	fclose(stdout);

	return 0;
}