Pagini recente » Cod sursa (job #3199100) | Cod sursa (job #3269784) | Cod sursa (job #2880488) | Cod sursa (job #493322) | Cod sursa (job #1739165)
#include<bits/stdc++.h>
using namespace std;
ifstream in("tribut.in");
ofstream out("tribut.out");
int n, m, s,t;
int f[1111], c[1111][1111];
vector<int> v[1111];
void read()
{
in >> n >> m;
s = 0;
t = n + m + 1;
for(int i = 1; i <= n; ++i)
{
int x;
in >> x;
v[s].push_back(i);
v[i].push_back(s);
c[s][i] = x;
c[i][s] = 0;
}
for(int i = 1; i <= m; ++i)
{
int p, sum;
in >> p >> sum;
v[i + n].push_back(t);
v[t].push_back(i + n);
c[i + n][t] = sum;
for(int j = 1; j <= p ; ++j) {
int x; in >> x;
v[x].push_back(n + i);
v[n + i].push_back(x);
c[x][n + i] = c[s][x];
c[n + i][x] = 0;
}
}
}
int bfs(int s, int t)
{
queue<int> q;
int viz[1111];
memset(viz,0,sizeof(viz));
q.push(s);
viz[s] = 1;
while(!q.empty())
{
int x = q.front();
q.pop();
for(int i = 0; i < v[x].size(); ++i)
if(!viz[v[x][i]] && c[x][v[x][i]])
{
viz[v[x][i]] = 1;
f[v[x][i]] = x;
q.push(v[x][i]);
}
}
return viz[t];
}
int main()
{
int T;
in>>T;
while(T--)
{
read();
int max_flow = 0;
while(bfs(s, t))
{
int flow = 0x3f3f3f3f;
for(int x = t; x != s; x = f[x])
flow = min(flow, c[f[x]][x]);
for(int x = t; x != s; x = f[x])
{
c[f[x]][x] -= flow,
c[x][f[x]] += flow;
}
max_flow += flow;
}
out<<max_flow<<'\n';
for(int i = s; i <= t; ++i)
{
v[i].clear();
for(int j = s; j <= t; ++j)
c[i][j] = 0;
}
}
return 0;
}