Cod sursa(job #7162)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 21 ianuarie 2007 12:55:16
Problema Aprindere Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasa a 9-a si gimnaziu Marime 1.8 kb
#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;

}