Pagini recente » Cod sursa (job #12381) | Cod sursa (job #2646351) | Cod sursa (job #2436285) | Cod sursa (job #937473) | Cod sursa (job #1709707)
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
#define MAX 210
#define INF 1<<30
using namespace std;
int t, n, m, c, s, F[MAX][MAX], C[MAX][MAX], p[MAX], cost;
bool viz[MAX];
vector<int> l[MAX];
bool bfs(){
memset(viz, 0, MAX * sizeof(bool));
queue<int> q;
q.push(0);
while(!q.empty()){
int x = q.front();
q.pop();
if(x != n + m + 1)
for(int i = 0; i < l[x].size(); ++i)
if(!viz[l[x][i]] && C[x][l[x][i]] != F[x][l[x][i]]){
viz[l[x][i]] = 1;
p[l[x][i]] = x;
q.push(l[x][i]);
}
}
return viz[n + m + 1];
}
int main(){
freopen("tribut.in", "r", stdin);
freopen("tribut.out", "w", stdout);
scanf("%d", &t);
for(int k = 0; k < t; ++k){
cost = 0;
scanf("%d%d", &n, &m);
int d = n + m + 1;
for(int i = 0; i < MAX; ++i){
memset(F, 0, MAX * sizeof(int));
memset(C, 0, MAX * sizeof(int));
memset(p, 0, MAX * sizeof(int));
l[i].clear();
}
for(int i = 1; i <= n; ++i){
scanf("%d", &C[0][i]);
l[0].push_back(i);
l[i].push_back(0);
}
for(int i = 1; i <= m; ++i){
l[n + i].push_back(n + m + 1);
l[d].push_back(n + i);
scanf("%d%d", &c, &C[n + i][d]);
for(int j = 0; j < c; ++j){
scanf("%d", &s);
C[s][n + i] = INF;
l[s].push_back(n + i);
l[n + i].push_back(s);
}
}
while(bfs()){
for(int i = n + 1; i < d; ++i)
if(viz[i] && C[i][d] != F[i][d]){
p[d] = i;
int u = d, v;
int minim = INF;
while(u != 0){
v = p[u];
minim = min(minim, C[v][u] - F[v][u]);
u = v;
}
cost += minim;
u = d;
while(u != 0){
v = p[u];
F[v][u] += minim;
F[u][v] -= minim;
u = v;
}
}
}
printf("%d\n", cost);
}
return 0;
}