Pagini recente » Cod sursa (job #1373998) | Cod sursa (job #3215316) | Cod sursa (job #2403971) | Cod sursa (job #2975643) | Cod sursa (job #1709970)
#include <fstream>
#include <string.h>
#include <queue>
#include<iostream>
using namespace std;
ifstream f("tribut.in");
ofstream q("tribut.out");
#define MAX 1000000000
int ecart[400][400];
int visited[400];
bool bfs(int s, int d, int ecart[400][400]){
queue <int> coada;
coada.push(s);
for (int i = 0; i<=d; i++) visited[i] = -2;
visited[s] = -1;
int prim;
while (!coada.empty()){
prim = coada.front();
coada.pop();
for (int i = 0; i<=d; i++){
if (visited[i] == -2 && ecart[prim][i] > 0){
visited[i] = prim;
coada.push(i);
}
}
}
return (visited[d] != -2);
}
int fordFulkerson(int s, int d, int mat[400][400]){
for (int i = 0; i <= d; i++){
for (int j = 0; j<=d; j++){
ecart[i][j] = mat[i][j];
}
}
int maxFlow = 0,u, flow;
while (bfs(s,d,ecart)){
flow = MAX;
for(u = d; u!=s; u=visited[u]){
if (ecart[visited[u]][u] < flow){
flow = ecart[visited[u]][u];
}
}
maxFlow+=flow;
for(u = d; u!=s; u=visited[u]){
ecart[visited[u]][u]-=flow;
ecart[u][visited[u]]+=flow;
}
}
return maxFlow;
}
int main()
{
int mat[400][400];
int t,n,m,unr, nod;
f>>t;
for(;t>0;t--){
f>>n>>m;
memset(mat,0,400*400*sizeof(int));
for (int i = 1; i<=n; i++) f>>mat[0][i];
for (int i = 1; i<=m; i++){
f>>unr>>mat[n+i][n+m+1];
for(int j = 1; j<=unr; j++){
f>>nod;
mat[nod][n+i] = MAX;
}
}
q<<fordFulkerson(0,n+m+1,mat)<<"\n";
}
return 0;
}