Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<cstring>
- #include<vector>
- using namespace std;
- int dp[2][(1<<17)],cena[200];
- vector<int> pred[200];
- int main()
- {
- memset(dp,-1,sizeof(dp));
- long long ans=0;
- int n,m,k,i,j,l,a,b,o=1;
- cin>>n>>m;
- int mask=0;
- for(i=0;i<m;i++)
- {
- cin>>j;
- ans+=j;
- cin>>l;
- for(j=0;j<l;j++)
- {
- cin>>a;
- a--;
- if((mask&(1<<a))!=0) mask|=(1<<(n+a));
- else mask|=(1<<a);
- }
- }
- //
- cin>>k;
- for(i=1;i<=k;i++)
- {
- cin>>cena[i];
- cin>>l;
- for(j=0;j<l;j++)
- {
- cin>>m;
- pred[i].push_back(m-1);
- }
- }
- //
- dp[0][mask]=ans;
- ans=999999999;
- int now=1,prev;
- for(i=1;i<=k;i++){
- prev=(now+1)%2;
- for(j=0;j<(1<<(2*n));j++)
- {
- if(dp[prev][j]==-1) continue;
- int mm=j;
- if(dp[now][j]>=0) dp[now][j]=min(dp[now][j],dp[prev][j]);
- else dp[now][j]=dp[prev][j];
- for(int z=0;z<pred[i].size();z++)
- {
- if((mm&(1<<pred[i][z]))!=0) mm|=(1<<(n+pred[i][z]));
- else mm|=(1<<pred[i][z]);
- }
- if(dp[now][mm]>=0) dp[now][mm]=min(dp[now][mm],dp[prev][j]+cena[i]);
- else dp[now][mm]=dp[prev][j]+cena[i];
- }
- now=(now+1)%2;
- }
- cout<<dp[(now+1)%2][(1<<(2*n))-1];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement