Cod sursa(job #729847)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 30 martie 2012 13:17:10
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<vector>
#define nmax 351
#define inf 2000000000
using namespace std;
int c[nmax][nmax],f[nmax][nmax],cost[nmax][nmax],d[nmax],t[nmax],n,m,S,D,FLUX,COST;
vector <int> l[nmax];
void cit(){
	FILE *f;
	int x,y,z,t,i;
	f=fopen("fmcm.in","r");
	fscanf(f,"%d%d%d%d",&n,&m,&S,&D);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d%d",&x,&y,&z,&t);
		l[x].push_back(y);
		l[y].push_back(x);
		c[x][y]=z;
		cost[x][y]=t;
		cost[y][x]=-t;
	}
	fclose(f);
}
int drum(){
	int sw,i,j;
	for(i=1;i<=n;i++){
		d[i]=inf;
		t[i]=0;
	}
	d[S]=0;
	sw=0;
	for(i=1;i<=n&&!sw;i++){
		sw=1;
		for(j=1;j<=n;j++)
			for(unsigned int k=0;k<l[j].size();k++)
				if(c[j][l[j][k]]!=f[j][l[j][k]]&&d[l[j][k]]>d[j]+cost[j][l[j][k]]&&d[j]!=inf){
					sw=0;
					d[l[j][k]]=d[j]+cost[j][l[j][k]];
					t[l[j][k]]=j;
				}
	}
	return d[D]==inf ? 0:1;
}
void actualizez(){
	int k,min;
	min=inf;
	for(k=D;k!=S;k=t[k])
		if(c[t[k]][k]-f[t[k]][k]<min)
			min=c[t[k]][k]-f[t[k]][k];
	for(k=D;k!=S;k=t[k]){
		f[t[k]][k]+=min;
		f[k][t[k]]-=min;
	}
	FLUX+=min;
	COST+=min*d[D];
}
void afis(){
	FILE *f;
	f=fopen("fmcm.out","w");
	fprintf(f,"%d\n",COST);
	fclose(f);
}
int main(){
	cit();
	while(drum())
		actualizez();
	afis();
	return 0;
}