Pagini recente » Cod sursa (job #854609) | Cod sursa (job #261634) | Cod sursa (job #1931867) | Cod sursa (job #3287146) | Cod sursa (job #1711116)
#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; }