Pagini recente » Cod sursa (job #2676124) | Cod sursa (job #1995500) | Cod sursa (job #168806) | Cod sursa (job #2455858) | Cod sursa (job #7162)
Cod sursa(job #7162)
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
vector <int> v[1001],o[1001];
int c[1001],
a[1001],
u[1001],
s[1001];
int i,n,m,j;
long long sol,t;
void read_data()
{
scanf("%d %d",&n,&m);
for (i=0;i<n;++i) scanf("%d",&a[i]);
for (i=1;i<=m;++i)
{
scanf("%d %d %d",&t,&c[i],&j);
for (;j>0;--j)
{
scanf("%d",&t);
v[i].push_back(t);
o[t].push_back(i);
}
}
t=0;
}
void use(int x)
{
for (int i=0;i<v[x].size();++i) a[v[x][i]]=1-a[v[x][i]];
u[x]=1;
t+=c[x];
}
void unuse(int x)
{
for (int i=0;i<v[x].size();++i) a[v[x][i]]=1-a[v[x][i]];
u[x]=0;
t-=c[x];
}
bool verif()
{
//int g=1;
for (i=0;i<n;++i)
if (a[i]==0)
return false;
return true;
}
void solve_critical()
{
for (i=0;i<n;++i) if (a[i]==0 && o[i].size()==1) use(o[i][0]);
}
void make_stiva()
{
for (int i=1;i<=m;++i) if (u[i]==0) s[++s[0]]=i;
}
void back(int x)
{
use(s[x]);
if (x<s[0])
{
for (int i=x+1;i<=s[0];++i)
back(i);
}
else if (verif() && t<sol) sol=t;
unuse(s[x]);
}
int main()
{
freopen("aprindere.in","r",stdin);
freopen("aprindere.out","w",stdout);
read_data();
/*for (i=0;i<n;++i) printf("%d ",a[i]);
printf("\n"); fflush(stdout);*/
solve_critical();
/*printf("t=%d\n",t);
for (i=0;i<n;++i) printf("%d ",a[i]);
printf("\n"); fflush(stdout);*/
make_stiva();
/*printf("s[0]=%d\n",s[0]);
for (i=1;i<=s[0];++i) printf("%d ",s[i]);
printf("\n");*/
sol=1000000000LL;
for (i=1;i<=s[0];++i)
back(i);
printf("%lld\n",sol);
return 0;
}