Cod sursa(job #1711116)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 30 mai 2016 16:19:01
Problema Tribut Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.01 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
using namespace std;

int max_flux(const int surs, const int dest,
		const vector<vector<int>>& vec, const vector<vector<int>>& cap,
		vector<vector<int>>& flux){
	const int n = vec.size();
	int rez = 0;
	vector<int> tata(n, -1);
	queue<int> de_viz;

	while(true){
		de_viz.push(surs);
		while(!de_viz.empty()){
			const int cur = de_viz.front();
			de_viz.pop();

			for(const auto next : vec[cur]){
				if(cap[cur][next] > flux[cur][next] && tata[next] == -1){
					tata[next] = cur;
					if(next != dest){
						de_viz.push(next); } } } }

		if(tata[dest] == -1){
			break; }

		for(const auto frunza : vec[dest]){
			if(flux[frunza][dest] < cap[frunza][dest] && tata[frunza] != -1){
				tata[dest] = frunza;
				int extra_flux = 10000000;
				for(int nod = dest; nod != surs; nod = tata[nod]){
					extra_flux = min(extra_flux, cap[tata[nod]][nod] - flux[tata[nod]][nod]); }
				for(int nod = dest; nod != surs; nod = tata[nod]){
					flux[tata[nod]][nod] += extra_flux;
					flux[nod][tata[nod]] -= extra_flux; }
				rez += extra_flux; } }
		fill(begin(tata), end(tata), -1); }
	return rez; }

void do_test(ifstream& f, ofstream& g){
	int n, m;
	f >> n >> m;

	const int surs = 0, dest = 1,
		st_sist = 2, st_uniuni = st_sist + n, sz = st_uniuni + m;

	vector<vector<int>> graf(sz), cap(sz, vector<int>(sz, 0)),
		flux(sz, vector<int>(sz, 0));

	auto add_muc = [&](const int x, const int y, const int c){
		graf[x].push_back(y), graf[y].push_back(x);
		cap[x][y] = c; };

	for(int i = 0, x; i < n; ++i){
		f >> x;
		add_muc(surs, st_sist + i, x); }

	for(int i = 0, p, x; i < m; ++i){
		f >> p >> x;
		for(int y; p; --p){
			f >> y;
			add_muc(st_sist + y - 1, st_uniuni + i, 1000000000); }
		add_muc(st_uniuni + i, dest, x); }

	g << max_flux(surs, dest, graf, cap, flux) << '\n'; }

const string filename = "tribut";

int main(){
	ifstream f(filename + ".in");
	ofstream g(filename + ".out");

	int t;
	f >> t;

	for( ; t; --t){
		do_test(f, g); }

	return 0; }