Cod sursa(job #1709829)

Utilizator UPB_itslupusUPB Crecana Cristache Jercaianu UPB_itslupus Data 28 mai 2016 14:04:08
Problema Tribut Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.81 kb
#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;
}