Pagini recente » Cod sursa (job #638979) | Cod sursa (job #2286929) | Cod sursa (job #182473) | Cod sursa (job #101639) | Cod sursa (job #1710140)
#include<bits/stdc++.h>
using namespace std;
typedef struct lnod {
int nod;
lnod *next;
}*nod;
const int INF=1e9+69*69;
int i,n,m,x,y,z,rs,q[305],a[305][305],qt,nr,qh,tata[305],t;
bool viz[305];
nod lda[305];
void add(int x,nod &y) {
nod p=new lnod;
p->nod=x;
p->next=y;
y=p;
}
void Update() {
int addflow=INF;
for(x=n+m+1;x!=0;x=tata[x]) addflow=min(addflow,a[tata[x]][x]);
rs+=addflow;
for(x=n+m+1;x!=0;x=tata[x]) a[tata[x]][x]-=addflow,a[x][tata[x]]=+addflow;
}
bool bfs() {
bool u=0;
memset(viz,0,sizeof(viz));
viz[0]=1; q[1]=0; tata[0]=0;
for(qh=qt=1;qh<=qt;++qh)
for(nod p=lda[q[qh]];p;p=p->next)
if(a[q[qh]][p->nod]>0 && !viz[p->nod])
{
viz[p->nod]=1; tata[p->nod]=q[qh]; q[++qt]=p->nod;
if(p->nod==n+m+1) Update(),viz[n+m+1]=0,--qt,u=1;
}
return u;
}
int main()
{
ifstream cin("tribut.in");
ofstream cout("tribut.out");
ios_base::sync_with_stdio(0); cin.tie(0);
for(cin>>t;t;--t)
{
memset(a,0,sizeof(a));
memset(lda,0,sizeof(lda));
cin>>n>>m; rs=0;
for(i=1;i<=n;++i)
{
cin>>x;
add(i,lda[0]); a[0][i]=x;
add(0,lda[i]);
}
for(i=1;i<=m;++i)
{
cin>>z>>y;
while(z--)
{
cin>>x;
add(n+i,lda[x]); a[x][n+i]=a[0][x];
add(x,lda[n+i]);
viz[x]=1;
}
add(n+m+1,lda[n+i]); a[n+i][n+m+1]=y;
add(n+i,lda[n+m+1]);
}
while(bfs());
cout<<rs<<'\n';
}
return 0;
}