Cod sursa(job #1991100)

Utilizator Bodo171Bogdan Pop Bodo171 Data 15 iunie 2017 10:03:58
Problema Tribut Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=205;
vector<int> v[nmax];
int fl[nmax][nmax],c[nmax][nmax],prec[nmax],q[nmax];
int n,m,i,j,source,sink,p,u,start,nod,minfl,flow,t,x;
bool bfs()
{
    u=1;q[u]=source;
    for(i=1;i<=sink;i++)
        prec[i]=0;
    prec[source]=-1;
    for(p=1;p<=u;p++)
    {
        start=q[p];
        for(i=0;i<v[start].size();i++)
        {
            nod=v[start][i];
            if((!prec[nod])&&fl[start][nod]<c[start][nod])
            {
                prec[nod]=start;
                u++;q[u]=nod;
                if(nod==sink) return 1;
            }
        }
    }
    return 0;
}
int main()
{
    ifstream f("tribut.in");
    ofstream g("tribut.out");
    f>>t;
    for(int cnt=1;cnt<=t;cnt++)
    {
        f>>n>>m;flow=0;
        source=n+m+1,sink=n+m+2;
        for(i=1;i<=sink;i++)
            {
            for(j=1;j<=sink;j++)
              fl[i][j]=c[i][j]=0;
              v[i].clear();
            }
        for(i=1;i<=n;i++)
        {
            f>>c[source][i];
            v[source].push_back(i);
        }
        for(i=1;i<=m;i++)
        {
            f>>p>>c[n+i][sink];
            v[n+i].push_back(sink);
            for(j=1;j<=p;j++)
            {
                f>>x;
                c[x][n+i]=(1<<30);
                v[x].push_back(n+i);
                v[n+i].push_back(x);
            }
        }
        while(bfs())
        {
            nod=sink;minfl=(1<<30);
            while(nod!=source)
            {
                minfl=min(minfl,c[prec[nod]][nod]-fl[prec[nod]][nod]);
                nod=prec[nod];
            }
            nod=sink;
            while(nod!=source)
            {
                fl[prec[nod]][nod]+=minfl;
                fl[nod][prec[nod]]-=minfl;
                nod=prec[nod];
            }
            flow+=minfl;
        }
        g<<flow<<'\n';
    }
    return 0;
}