Cod sursa(job #371003)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 2 decembrie 2009 23:37:57
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <list>
#define MAX 400
#define inf 2100000000
using namespace std;
ifstream fi("fmcm.in");
ofstream fo("fmcm.out");
int F[MAX][MAX],C[MAX][MAX];
vector<pair<int,int> > G[MAX];
int N,M,sursa,dest;
int Dist[MAX],heap[MAX],poz[MAX],T[MAX];
list<int> L;


void citire(){
	fi>>N>>M>>sursa>>dest;
	int a,b,c,d;
	for (int i=1;i<=M;++i){
		fi>>a>>b>>c>>d;
		C[a][b]=c;
		G[a].push_back(make_pair(b,d));
		G[b].push_back(make_pair(a,-d));
	}
}

int BellmanFord(){
	for (int i=1;i<=N;++i) Dist[i]=inf,T[i]=-1;
	L.push_back(sursa);
	Dist[sursa]=0;
	while (!L.empty()){
		list<int>::iterator it=L.begin();
		for (unsigned int i=0;i<G[*it].size();++i)
			if (C[*it][G[*it][i].first]-F[*it][G[*it][i].first]>0)
				if (Dist[G[*it][i].first]>(Dist[*it]+G[*it][i].second)){
					Dist[G[*it][i].first]=Dist[*it]+G[*it][i].second;
					T[G[*it][i].first]=*it;
					L.push_back(G[*it][i].first);
				}
		L.pop_front();
	}
	if (Dist[dest]<inf) return 1; else return 0;
}


long long flow(){
	long long rez=0;
	while (BellmanFord()){
		int maxflow=inf;
		for (int nod=dest;nod!=sursa;nod=T[nod]) maxflow=min(maxflow,C[T[nod]][nod]-F[T[nod]][nod]);
		if (maxflow>0)
			for (int nod=dest;nod!=sursa;nod=T[nod]) { F[T[nod]][nod]+=maxflow; F[nod][T[nod]]-=maxflow; }
	}
	for (int i=1;i<=N;++i)
		for (unsigned int j=0;j<G[i].size();++j)
			rez+=(long long)F[i][G[i][j].first]*G[i][j].second;
	return rez/2;
}


int main(){
	citire();
	fo<<flow()<<"\n";
	fi.close();fo.close();
	return 0;
}