Cod sursa(job #1900930)

Utilizator prazillaPrazilla prazilla Data 3 martie 2017 17:39:56
Problema Tribut Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.84 kb
#include <stdio.h>
#include <vector>
#include <cstring>
#include <queue>
#include <limits.h>

#define Max 205
using namespace std;
int n, m, T, t[Max], y, C[Max][Max], flow, r, p;
vector<int> G[Max];
queue<int> Q;

bool bfs() {
    int i, s, z;
    Q.push(0);
    memset(t, -1, (y + 1) * sizeof(int));
    while (!Q.empty()) {
        s = Q.front();
        Q.pop();
        z = G[s].size();
        for (i = 0; i < z; i++)
            if (t[G[s][i]] == -1 && C[s][G[s][i]] > 0) {
                t[G[s][i]] = s;
                Q.push(G[s][i]);
            }
    }
    return (t[y] != -1);
}

int main() {
    freopen("tribut.in", "r", stdin);
    freopen("tribut.out", "w", stdout);
    scanf("%i", &T);
    int i, j, x;
    while (T--) {
        scanf("%i%i", &n, &m);
        y = n + m + 1;
        G[0].clear();
        G[y].clear();
        for (i = 1; i <= n; i++) {
            G[i].clear();
            scanf("%i", &x);
            C[0][i] = x;
            C[i][0] = 0;
            G[0].push_back(i);
            G[i].push_back(0);
        }
        for (i = 1; i <= m; i++) {
            G[n + i].clear();
            scanf("%i%i", &p, &x);
            C[n + i][y] = x;
            C[y][n + i] = 0;
            G[n + i].push_back(y);
            G[y].push_back(n + i);
            for (j = 1; j <= p; j++) {
                scanf("%i", &x);
                G[x].push_back(n + i);
                G[n + i].push_back(x);
                C[x][n + i] = INT_MAX;
                C[n + i][x] = 0;
            }
        }

        flow = 0;
        while (bfs()) {
            r = INT_MAX;

            for (i = y; i != 0; i = t[i])
                r = min(r, C[t[i]][i]);
            for (i = y; i != 0; i = t[i]) {
                C[t[i]][i] -= r;
                C[i][t[i]] += r;
            }
            flow += r;
        }
        printf("%i\n", flow);
    }
    return 0;
}