Cod sursa(job #891176)

Utilizator mika17Mihai Alex Ionescu mika17 Data 25 februarie 2013 14:20:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <queue>

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);
			std::vector<bool> inQ(N,false);
			std::queue<int> Q;
			pi[S] = 0; fat[S] = S; Q.push(S); inQ[S] = true;

			while(!Q.empty()) {
				int i = Q.front(); Q.pop(); inQ[i] = false;

				for(unsigned j=0;j<Gr[i].size();++j) {
					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(!inQ[Gr[i][j]])
							inQ[Gr[i][j]] = true, Q.push(Gr[i][j]);
					}
				}
			}
			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;
}