Pagini recente » Cod sursa (job #1509084) | Cod sursa (job #249954) | Cod sursa (job #1163064) | Cod sursa (job #2432338) | Cod sursa (job #1709816)
#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 0x3f3f3f3f
ifstream fin("tribut.in");
ofstream fout("tribut.out");
int C[NMAX][NMAX];
int F[NMAX][NMAX];
int TT[NMAX];
int N, M, T;
int cd[NMAX];
int viz[NMAX];
int BF(vector<int> G[NMAX])
{
int 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()
{
int i, flow, fmin, x, y, z, nod;
int nr, tmax;
// scanf("%d", &T);
fin >> T;
// printf("penis\n");
for (int t = 0; t < T; ++t) {
// printf("test=%d\n", t);
vector<int> G[NMAX];
for (int i = 0; i < NMAX; ++i) {
for (int 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 (int 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;
}
printf("%d\n", flow);
}
return 0;
}