Pagini recente » Cod sursa (job #702884) | Cod sursa (job #2394872) | Cod sursa (job #1001633) | Cod sursa (job #1671452) | Cod sursa (job #1709829)
#include <stdio.h>
#include <vector>
#include <string.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
#define NMAX 205
#define pb push_back
#define sz size()
#define mp make_pair
#define INF 1000000000
ifstream fin("tribut.in");
ofstream fout("tribut.out");
long long C[NMAX][NMAX];
long long F[NMAX][NMAX];
long long TT[NMAX];
long long N, M, T;
long long cd[NMAX];
long long viz[NMAX];
long long BF(vector<long long> G[NMAX])
{
long long i, j, nod, V;
cd[0] = 1;
cd[1] = 0;
memset(viz, 0, sizeof(viz));
viz[0] = 1;
for (i = 1; i <= cd[0]; i++)
{
nod = cd[i];
if (nod == 201) continue;
for (j = 0; j < G[nod].sz; j++)
{
V = G[nod][j];
if (C[nod][V] == F[nod][V] || viz[V]) continue;
viz[V] = 1;
cd[ ++cd[0] ] = V;
TT[V] = nod;
}
}
return viz[201];
}
int main()
{
long long i, flow, fmin, x, y, z, nod;
long long nr, tmax;
// scanf("%d", &T);
fin >> T;
// prlong longf("penis\n");
for (long long t = 0; t < T; ++t) {
// prlong longf("test=%d\n", t);
vector<long long> G[NMAX];
for (long long i = 0; i < NMAX; ++i) {
for (long long j = 0; j < NMAX; ++j) {
F[i][j] = C[i][j] = 0;
}
TT[i] = 0;
viz[i] = 0;
}
// scanf("%d %d ", &N, &M);
fin >> N >> M;
for (i = 1; i <= N; ++i) {
// scanf("%d", &nod);
fin >> nod;
C[0][i] = nod;
G[0].pb(i);
G[i].pb(0);
}
for (i = 1; i <= M; ++i) {
// scanf("%d %d", &nr, &tmax);
fin >> nr >> tmax;
for (long long j = 1; j <= nr; ++j) {
// scanf("%d", &nod);
fin >> nod;
C[nod][100+i] = INF;
G[nod].pb(100+i);
G[100+i].pb(nod);
}
C[100+i][201] = tmax;
G[100+i].pb(201);
G[201].pb(100+i);
}
for (flow = 0; BF(G);)
for (i = 0; i < G[201].sz; i++)
{
nod = G[201][i];
if (F[nod][201] == C[nod][201] || !viz[nod]) continue;
TT[201] = nod;
fmin = INF;
for (nod = 201; nod != 0; nod = TT[nod])
fmin = min(fmin, C[ TT[nod] ][nod] - F[ TT[nod] ][nod]);
if (fmin == 0) continue;
for (nod = 201; nod != 0; nod = TT[nod])
{
F[ TT[nod] ][nod] += fmin;
F[nod][ TT[nod] ] -= fmin;
}
flow += fmin;
}
fout << flow << '\n';
}
return 0;
}