Pagini recente » Cod sursa (job #3181728) | Cod sursa (job #2444637) | Cod sursa (job #2583759) | Cod sursa (job #1742976) | Cod sursa (job #1709679)
#include <iostream>
using namespace std;
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 300
#define inf 100000
int n, m, x, y, z, i, nbf, inc, sf, fmin, rez, ntn, el, nod,a,nr,tt;
vector <int> ma[nmax];
vector <int> ::iterator it;
int co[nmax], t[nmax], viz[nmax], tn[nmax], cap[nmax][nmax];
void citire(){
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&a);
x=0; y=i; z=a;
x++; y++;
ma[x].push_back(y); cap[x][y]=z;
ma[y].push_back(x);
}
for (int i=1;i<=m;i++){
scanf("%d %d",&nr,&z);
x=i+n; y=n+m+1;
x++; y++;
ma[x].push_back(y); cap[x][y]=z;
ma[y].push_back(x);
for (int j=1;j<=nr;j++){
scanf("%d",&x);
y=i+n; z=inf;
x++; y++;
ma[x].push_back(y); cap[x][y]=z;
ma[y].push_back(x);
}
}
/*for (i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&x,&y,&z);
ma[x].push_back(y); cap[x][y]=z;
ma[y].push_back(x);
}*/
}
void bfs()
{
nbf++; ntn=0;
co[1]=sf=inc=1;
viz[1]=nbf;
while (inc<=sf)
{
el=co[inc]; inc++;
if (el==n)
break;
for (it=ma[el].begin();it!=ma[el].end();it++)
if (cap[el][*it]>0)
{
if (viz[*it]!=nbf)
{
co[++sf]=*it;
viz[*it]=nbf;
t[*it]=el;
}
if ((*it)==n)
tn[++ntn]=el;
}
}
}
void rezolvare()
{
while (1)
{
bfs();
if (viz[n]==nbf)
for (i=1;i<=ntn;i++)
{
t[n]=tn[i];
nod=n; fmin=inf;
while ((nod>1)&&(fmin>0))
{
if (fmin>cap[t[nod]][nod])
fmin=cap[t[nod]][nod];
nod=t[nod];
}
if (fmin>0)
{
nod=n;
while (nod>1)
{
cap[t[nod]][nod]-=fmin;
cap[nod][t[nod]]+=fmin;
nod=t[nod];
}
}
rez+=fmin;
}
else
break;
}
}
int main()
{
freopen("tribut.in","r",stdin);
freopen("tribut.out","w",stdout);
scanf("%d",&tt);
while (tt--)
{
citire();
n=n+m+2;
rezolvare();
printf("%ld\n",rez);
rez=0;
for (int i=1;i<=n;i++){
ma[i].clear();
viz[i]=0;
t[i]=tn[i]=0;
for (int j=1;j<=n;j++)
cap[i][j]=0;
}
}
return 0;
}