Cod sursa(job #604237)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 21 iulie 2011 11:54:24
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<bitset>

#define maxN 355
#define INF (1<<30)

using namespace std;

FILE*f=fopen("fmcm.in","r");
FILE*g=fopen("fmcm.out","w");

int n,m,S,D,i,x,y,c,z,C[maxN],FlowCost;
int Cp[maxN][maxN],F[maxN][maxN],minim;
int T[maxN],qsize,nod,Cst[maxN][maxN],nodvcn;

vector<int>G[maxN]; queue<int>Q;
bitset<maxN>inQ;

inline void citire () {
	
	fscanf(f,"%d %d %d %d",&n,&m,&S,&D);
	
	for ( i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d %d",&x,&y,&c,&z);
		G[x].push_back(y);
		G[y].push_back(x);
		Cp[x][y] = c; Cst[x][y] = z; Cst[y][x] = -z;
	}
}

inline void init () {
	
	while ( qsize ){ Q.pop(); --qsize; };
	for ( i = 1 ; i <= n ; ++i ){
		inQ[i] = 0; C[i] = INF; T[i] = 0;
	}
	C[S] = 0; minim = INF;
	Q.push(S); qsize = 1; inQ[S] = 1;
}

inline int bellmanford () {
	
	init();
	
	while ( qsize ){
		
		nod = Q.front(); Q.pop(); --qsize; inQ[nod] = 0;
		
		for ( i = 0 ; i < G[nod].size() ; ++i ){
			nodvcn = G[nod][i];
			if ( Cp[nod][nodvcn] > F[nod][nodvcn] && C[nodvcn] > C[nod] + Cst[nod][nodvcn] ){
				C[nodvcn] = C[nod] + Cst[nod][nodvcn]; T[nodvcn] = nod;
				if ( !inQ[nodvcn] ){
					inQ[nodvcn] = 1;
					Q.push(nodvcn); ++qsize;
				}
			}
		}
	}
	
	if ( C[D] != INF ){
		
		for ( nod = D ; T[nod]; nod = T[nod] ){
			minim = Cp[T[nod]][nod] - F[T[nod]][nod] < minim ? Cp[T[nod]][nod] - F[T[nod]][nod] : minim;
		}
		for ( nod = D ; T[nod] ; nod = T[nod] ){
			F[T[nod]][nod] += minim;
			F[nod][T[nod]] -= minim;
		}
		
		return minim * C[D];
	}
	
	return INF;
}

inline void fmcm () {
	
	while ( ( c = bellmanford() ) != INF ){
		FlowCost += c;
	}
	
	fprintf(g,"%d\n",FlowCost);
}

int main () {
	
	citire();
	fmcm();
	
	fclose(f);
	fclose(g);
	
	return 0;
}