Cod sursa(job #669305)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 26 ianuarie 2012 18:51:33
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 356
#define INF (1<<28)
using namespace std;
vector <short> G[NMAx],Cost[NMAx];
queue <short> q;
int n,S,D,color,maxflow,Flux[NMAx][NMAx],dist[NMAx];
int tata[NMAx],in_queue[NMAx];

bool BF() {
	int i,nod,vecin;
	
	for(i=1;i<=n;i++)
		dist[i]=INF;
	color++;
	q.push(S);
	dist[S]=0;
	
	while(!q.empty()) {
		nod=q.front();
		in_queue[nod]=false;
		q.pop();
		for(i=0;i<G[nod].size();i++) {
			vecin=G[nod][i];
			if(Flux[nod][vecin]>0&&dist[vecin]>dist[nod]+Cost[nod][i]) {
				dist[vecin]=dist[nod]+Cost[nod][i];
				tata[vecin]=nod;
				if(in_queue[vecin]!=color) {
					q.push(vecin);
					in_queue[vecin]=color;
					}
				}
			}
		}
	
	if(dist[D]==INF)
		return 0;
	return 1;
	
}
void citire() {
	
	int i,x,y,cap,cost,m;
	ifstream in("fmcm.in");
	in>>n>>m>>S>>D;
	for(i=0;i<m;i++) {
		in>>x>>y>>cap>>cost;
		G[x].push_back(y);
		G[y].push_back(x);
		Flux[x][y]=cap;
		Cost[x].push_back(cost);
		Cost[y].push_back(-cost);
		}
	in.close();

}
int main() {
	
	int nod,flux;
	citire();
	
	while(BF()) {
		
		flux=INF;
		for(nod=D;nod!=S;nod=tata[nod])
			flux=min(flux,Flux[tata[nod]][nod]);
		
		for(nod=D;nod!=S;nod=tata[nod]) {
			Flux[tata[nod]][nod]-=flux;
			Flux[nod][tata[nod]]+=flux;
			}
		
		maxflow+=flux*dist[D];
		
		}
	
	ofstream out("fmcm.out");
	out<<maxflow<<'\n';
	out.close();
	
	return 0;

}