Pagini recente » Cod sursa (job #2199167) | Cod sursa (job #2516650) | Cod sursa (job #181150) | Cod sursa (job #1253826) | Cod sursa (job #1709546)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("tribut.in");
ofstream fout("tribut.out");
#define MAX 220
#define INF 1000000000
typedef vector <int> :: iterator iter;
vector <int> G[MAX];
int viz[MAX], dad[MAX];
int maxflow;
int C[MAX][MAX], F[MAX][MAX];
int Q[2 * MAX];
void make_edge(int i, int j, int k)
{
//cout << i << " " << j << " " << k << "\n";
G[i].push_back(j);
G[j].push_back(i);
C[i][j] = k;
}
bool bfs(int s, int d)
{
int st, dr, nod, flux, i;
memset(viz, 0, sizeof(viz));
st = 0;
dr = -1;
Q[++dr] = s;
viz[s] = 1;
while(st <= dr)
{
nod = Q[st++];
for(iter it = G[nod].begin() ; it != G[nod].end() ; it++)
{
if(!viz[*it] && F[nod][*it] < C[nod][*it])
{
viz[*it] = 1;
dad[*it] = nod;
Q[++dr] = *it;
}
}
}
if(!viz[d])
return 0;
flux = INF;
for(i = d ; i != s ; i = dad[i])
{
flux = min(flux, C[dad[i]][i] - F[dad[i]][i]);
}
//cout << flux << "\n";
for(i = d ; i != s ; i = dad[i])
{
F[dad[i]][i] += flux;
F[i][dad[i]] -= flux;
}
maxflow += flux;
return 1;
}
int main()
{
int t, n, m, x, i, k, cost, j;
fin >> t;
while(t--)
{
memset(C, 0, sizeof(C));
memset(F, 0, sizeof(F));
fin >> n >> m;
maxflow = 0;
for(i = 1 ; i <= n ; i++)
{
fin >> x;
make_edge(0, i, x);
}
for(i = 1 ; i <= m ; i++)
{
fin >> k;
fin >> cost;
for(j = 1 ; j <= k ; j++)
{
fin >> x;
make_edge(x, n + i, INF);
}
make_edge(n + i, n + m + 1, cost);
}
while(bfs(0, n + m + 1))
{
}
fout << maxflow << "\n";
}
}