Cod sursa(job #1739165)

Utilizator c0mradec0mrade c0mrade Data 8 august 2016 18:38:04
Problema Tribut Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.93 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("tribut.in");
ofstream out("tribut.out");

int n, m, s,t;
int f[1111], c[1111][1111];
vector<int> v[1111];

void read()
{
    in >> n >> m;
    s = 0;
    t = n + m + 1;
    for(int i = 1; i <= n; ++i)
    {
        int x;
        in >> x;
        v[s].push_back(i);
        v[i].push_back(s);
        c[s][i] = x;
        c[i][s] = 0;
    }
    for(int i = 1; i <= m; ++i)
    {
        int p, sum;
        in >> p >> sum;
        v[i + n].push_back(t);
        v[t].push_back(i + n);
        c[i + n][t] = sum;

        for(int j = 1; j <= p ; ++j) {
            int x; in >> x;

            v[x].push_back(n + i);
            v[n + i].push_back(x);
            c[x][n + i] = c[s][x];
            c[n + i][x] = 0;
        }
    }
}

int bfs(int s, int t)
{
    queue<int> q;
    int viz[1111];
    memset(viz,0,sizeof(viz));
    q.push(s);
    viz[s] = 1;
    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        for(int i = 0; i < v[x].size(); ++i)
            if(!viz[v[x][i]] && c[x][v[x][i]])
            {
                viz[v[x][i]] = 1;
                f[v[x][i]] = x;
                q.push(v[x][i]);
            }
    }
    return viz[t];
}

int main()
{
    int T;
    in>>T;
    while(T--)
    {
        read();
        int max_flow = 0;
        while(bfs(s, t))
        {
            int flow = 0x3f3f3f3f;
            for(int x = t; x != s; x = f[x])
                flow = min(flow, c[f[x]][x]);
            for(int x = t; x != s; x = f[x])
            {
                c[f[x]][x] -= flow,
                c[x][f[x]] += flow;
            }
            max_flow += flow;
        }
        out<<max_flow<<'\n';
        for(int i = s; i <= t; ++i)
        {
            v[i].clear();
            for(int j = s; j <= t; ++j)
                c[i][j] = 0;
        }
    }
    return 0;
}