Cod sursa(job #2414022)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 23 aprilie 2019 22:47:36
Problema Tribut Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.11 kb

//#include<iostream>

#include<fstream>

#include<unordered_map>

#include<set>

#include<queue>

#include<algorithm>

#include<ctime>

#define x first

#define y second

#define pb push_back

using namespace std;

ifstream fin("tribut.in");

ofstream fout("tribut.out");

const int DN=605;

int q[DN],nrq;

int t,n,m,cap[DN][DN],fl[DN][DN],nr,a[DN],f,g,z,vec[DN],b[DN],nrv,sistem[DN];

int flux,viz[DN],pr[DN];

vector<int>v[DN];

void add()

{

	v[f].pb(g);

	v[g].pb(f);

	cap[f][g]=z;

}

int vf()

{

	int nod;

	for(int i=1;i<=nr;i++)

		viz[i]=0;

	viz[1]=1;

	nrq=q[1]=1;

	for(int h=1;h<=nrq;h++)

	{

		nod=q[h];

		if(nod==nr)

            continue;

		//return 0;

		for(auto i:v[nod])

			if(fl[nod][i]<cap[nod][i]&&!viz[i])

			{

				viz[i]=1;

				pr[i]=nod;

				nrq++;

				q[nrq]=i;

			}

	}

	return viz[nr];

}

int main()

{

	fin>>t;

	while(t--)

	{

		fin>>n>>m;

		for(int i=1;i<DN;i++)

			for(int j=1;j<DN;j++)

				fl[i][j]=cap[i][j]=0;

        for(int i=1;i<DN;i++)

            v[i].clear();

		nr=0;

		nr++;

		for(int i=1;i<=n;i++)

		{

			fin>>a[i];

			nr++;

			f=1;

			g=nr;

			z=a[i];

			vec[i]=i+1;

			add();

		}

		for(int i=1;i<=m;i++)

		{

			nr++;

			sistem[i]=nr;

			g=nr;

			fin>>nrv;

			fin>>b[i];

			for(int j=1;j<=nrv;j++)

			{

				fin>>f;

				f=vec[f];

				z=1e9;

				add();

			}

		}

		nr++;

		for(int i=1;i<=m;i++)

		{

			f=sistem[i];

			g=nr;

			z=b[i];

			add();

		}

		flux=0;

		while(vf())

		{

			for(auto i:v[nr])

			//if(viz[i])

			{

				pr[nr]=i;

				z=1e9;

				int nod=nr;

				while(nod!=1)

				{

					//if(nod==0)

					//	break;

					z=min(z,cap[pr[nod]][nod]-fl[pr[nod]][nod]);

					nod=pr[nod];

				}

				nod=nr;

				while(nod!=1)

				{

					//if(nod==0)

					//	break;

					fl[pr[nod]][nod]+=z;

					fl[nod][pr[nod]]-=z;

					nod=pr[nod];

				}

				flux+=z;

			}

		}

		fout<<flux<<'\n';

	}

}