Cod sursa(job #1709546)

Utilizator UBB_HakunaMatataUBB Cozma Nechita Pop UBB_HakunaMatata Data 28 mai 2016 12:48:57
Problema Tribut Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.01 kb
#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";
    }

}