Advertisement
royalsflush

GCJ13 D-small WA

Apr 14th, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string.h>
  5. using namespace std;
  6.  
  7. #define MAX_N 25
  8. #define MAX_K 45
  9.  
  10. int t; int k,n;
  11. int sk[MAX_K];
  12. int openk[MAX_N];
  13. vector<int> keyins[MAX_N];
  14.  
  15. int dp[(1<<20)+10];
  16. int memp[(1<<20)+10];
  17.  
  18. int doit(int bm) {
  19.     if (dp[bm]!=-1)
  20.         return dp[bm];
  21.     dp[bm]=0;
  22.     int keysAv[210];
  23.    
  24.     memset(keysAv,0,sizeof(keysAv));
  25.  
  26.     for (int i=0; i<k; i++)
  27.         keysAv[sk[i]]++;
  28.  
  29.     for (int i=0; i<n; i++)
  30.         if ((1<<i)&bm) {
  31.             keysAv[openk[i]]--;
  32.  
  33.             for (int j=0; j<(int)keyins[i].size(); j++)
  34.                 keysAv[keyins[i][j]]++;
  35.         }
  36.  
  37.     for (int i=0; i<n; i++) {
  38.         if (keysAv[openk[i]]==0) continue;
  39.         if (doit(bm|(1<<i))) {
  40.             if (dp[bm]!=1) memp[bm]=i;
  41.             dp[bm]=1;
  42.         }
  43.     }
  44.    
  45.     return dp[bm];
  46. }
  47.  
  48.  
  49. int main() {
  50.     scanf("%d", &t);
  51.  
  52.     for (int casen=1; casen<=t; casen++) {
  53.         scanf("%d %d", &k,&n);
  54.         for (int i=0; i<n; i++)
  55.             keyins[i].clear();
  56.        
  57.         for (int i=0; i<k; i++)
  58.             scanf("%d", &sk[i]);
  59.  
  60.         for (int i=0; i<n; i++) {
  61.             int tmp;
  62.             scanf("%d %d", &openk[i], &tmp);
  63.            
  64.             for (int j=0; j<tmp; j++) {
  65.                 int ktmp;
  66.                 scanf("%d", &ktmp);
  67.                 keyins[i].push_back(ktmp);
  68.             }
  69.         }
  70.  
  71.         memset(dp,-1,sizeof(dp));
  72.         memset(memp,-1,sizeof(memp));
  73.         dp[(1<<n)-1]=1;    
  74.  
  75.         printf("Case #%d:", casen);
  76.  
  77.         if (doit(0)!=1) {
  78.             printf(" IMPOSSIBLE\n");
  79.             continue;
  80.         }
  81.  
  82.         int mask=0;
  83.         while (memp[mask]!=-1) {
  84.             printf(" %d", memp[mask]);
  85.             mask|=(1<<memp[mask]);
  86.         }
  87.         printf("\n");
  88.     }
  89.    
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement