Cod sursa(job #1511512)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 26 octombrie 2015 20:32:36
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

constexpr int inf = 1000000001;

auto cmp = [](const pair<int, int>& a, const pair<int, int>& b){
	return a.first > b.first; };

void dijkstra(const int surs, const int dest,
	const vector<vector<int> >& graf,
	const vector<vector<int> >& cap, const vector<vector<int> >& flux, const vector<vector<int> >& lung,
	vector<int>& dist, vector<int>& tata){

	fill(begin(dist), end(dist), inf), fill(begin(tata), end(tata), -1);
	static priority_queue<pair<int, int>, vector<pair<int, int> >, decltype(cmp)> de_viz(cmp);
	while(!de_viz.empty()){
		de_viz.pop(); }

	dist[surs] = 0;
	tata[surs] = surs;
	de_viz.emplace(0, surs);

	while(!de_viz.empty()){
		const int cur = de_viz.top().second, dist_cur = de_viz.top().first;
		de_viz.pop();
		if(cur == dest){
			return; }
		if(dist_cur != dist[cur]){
			continue; }

		for(const auto next : graf[cur]){
			if(cap[cur][next] - flux[cur][next] > 0 && dist_cur + lung[cur][next] < dist[next]){
				dist[next] = dist_cur + lung[cur][next];
				tata[next] = cur;
				de_viz.emplace(dist[next], next); } } } }

int fmcm(const int surs, const int dest,
	const vector<vector<int> >& graf, const vector<vector<int> >& cap,
	vector<vector<int> >& flux, const vector<vector<int> >& lung){

	const int n = graf.size();

	vector<int> dist(n), tata(n);
	int rez = 0;

	while(true){
		dijkstra(surs, dest, graf, cap, flux, lung, dist, tata);
		if(tata[dest] == -1){
			return rez; }
		int flux_aug = inf;
		for(int cur = dest; cur != surs; cur = tata[cur]){
			flux_aug = min(flux_aug, cap[tata[cur]][cur] - flux[tata[cur]][cur]);
			rez += lung[tata[cur]][cur]; }
		for(int cur = dest; cur != surs; cur = tata[cur]){
			flux[tata[cur]][cur] += flux_aug;
			flux[cur][tata[cur]] -= flux_aug; } } }

void add_lat(const int a, const int b, const int c, vector<vector<int> >& graf, vector<vector<int> >& cap, vector<vector<int> >& flux, vector<vector<int> >& lung){
	graf[a].push_back(b);
	graf[b].push_back(a);
	cap[a][b] = 1;
	lung[a][b] = c;
	lung[b][a] = -c; }

void read_graf(int& surs, int& dest, vector<vector<int> >& graf, vector<vector<int> >& cap, vector<vector<int> >& flux, vector<vector<int> >& lung){
	ifstream f("cc.in");
	int n;
	f >> n;
	surs = 0;
	const int st_oameni = 1, st_computere = n+1;
	dest = 2*n+1;
	graf.resize(dest+1);
	cap.resize(dest+1, vector<int>(dest+1, 0)), flux.resize(dest+1, vector<int>(dest+1, 0)),
		lung.resize(dest+1, vector<int>(dest+1, 0));
	for(int i = 0; i < n; ++i){
		add_lat(surs, st_oameni + i, 0, graf, cap, flux, lung); }
	for(int i = 0; i < n; ++i){
		add_lat(st_computere + i, dest, 0, graf, cap, flux, lung); }
	for(int i = 0, x; i < n; ++i){
		for(int j = 0; j < n; ++j){
			f >> x;
			add_lat(st_oameni + i, st_computere + j, x, graf, cap, flux, lung); } } }

int main(){
	int surs, dest;
	vector<vector<int> > graf, cap, flux, lung;
	read_graf(surs, dest, graf, cap, flux, lung);
	ofstream g("cc.out");
	for(const auto y : lung){
		for(const auto x : y){
			cout << x << ' '; }
		cout << endl; }
	g << fmcm(surs, dest, graf, cap, flux, lung);
	return 0; }