Cod sursa(job #891147)

Utilizator mika17Mihai Alex Ionescu mika17 Data 25 februarie 2013 13:59:40
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>

int main() {

	std::ifstream in("fmcm.in");
	std::ofstream out("fmcm.out");
	
	int N,M,S,D;
	in>>N>>M>>S>>D;
	--S; --D;
	std::vector < std::vector< std::pair<int,int> > > G( N , std::vector< std::pair<int,int> > (N) );
	std::vector< std::vector<int> > Gr(N,std::vector<int>());

	while(M--) {
		int x,y,u,c;
		in>>x>>y>>u>>c;
		--x; --y;
		Gr[x].push_back(y);
		Gr[y].push_back(x);
		G[x][y] = std::make_pair(u,c);
		G[y][x] = std::make_pair(0,-c);
	}

	int cost = 0;

	while(true) {

		{
			std::vector<int> pi(N,0x7FFFFFFF), fat(N,0x7FFFFFFF);
			pi[S] = 0; fat[S] = S;
			for(int k=0;k<N - 1;++k)
				for(int i=0;i<N;++i) //i is a node
					for(int j=0;j<Gr[i].size();++j) { //j is not a node, Gr[i][j] is

						if(G[i][Gr[i][j]].first > 0 && pi[i] != 0x7FFFFFFF && pi[i] + G[i][Gr[i][j]].second < pi[Gr[i][j]]) {
							fat[Gr[i][j]] = i;
							pi[Gr[i][j]] = pi[i] + G[i][Gr[i][j]].second;
						}
					}
			if(pi[D] != 0x7FFFFFFF) {
				
				int min = 0x7FFFFFFF;
				for(int t = D; fat[t] != t; t = fat[t]) {
					min = std::min(min,G[fat[t]][t].first);
				}
				for(int t = D; fat[t] != t; t = fat[t]) {
					G[fat[t]][t].first -= min;
					G[t][fat[t]].first += min;
				}
				cost += min * pi[D];
			}
			else break;
		}
	}

	out<<cost;
	return 0;
}