Pagini recente » Cod sursa (job #1276134) | Cod sursa (job #2713328) | Cod sursa (job #2779883) | Cod sursa (job #628812) | Cod sursa (job #2323892)
#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;
queue<int>q;
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;
q.push(1);
while(!q.empty())
{
nod=q.front();
q.pop();
//return 0;
for(auto i:v[nod])
if(fl[nod][i]!=cap[nod][i]&&!viz[i])
{
viz[i]=1;
pr[i]=nod;
q.push(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;
nr=0;
nr++;
for(int i=1;i<=n;i++)
{
fin>>a[i];
nr++;
f=1;
g=nr;
z=1e9;
add();
}
for(int i=1;i<=n;i++)
{
f=i+1;
nr++;
g=nr;
z=a[i];
add();
vec[i]=nr;
}
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';
}
}