【HDOJ】1818 It's not a Bug, It's a Feature!

状态压缩+优先级bfs。

  1 /* 1818 */
  2 #include <iostream>
  3 #include <queue>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <cstdlib>
  7 #include <algorithm>
  8 using namespace std;
  9 
 10 #define MAXM 105
 11 
 12 typedef struct {
 13     int t;
 14     int bm, bp;    // before minus/plus
 15     int am, ap; // after minus/plus
 16 }  patch_t;
 17 
 18 typedef struct node_t {
 19     int v, t;
 20     node_t() {}
 21     node_t(int vv, int tt) {
 22         v = vv; t = tt;
 23     }
 24     friend bool operator <(const node_t &a, const node_t &b) {
 25         return a.t > b.t;
 26     }
 27 } node_t;
 28 
 29 int n, m;
 30 patch_t patch[MAXM];
 31 int visit[1<<20];
 32 char bs[25], as[25];
 33 
 34 int bfs() {
 35     int i, j, k;
 36     int v, t;
 37     node_t nd = node_t((1<<n)-1, 0);
 38     priority_queue<node_t> Q;
 39     
 40     memset(visit, 0x3f, sizeof(int)*(1<<n));
 41     visit[nd.v] = 0;
 42     Q.push(nd);
 43     
 44     while (!Q.empty()) {
 45         nd = Q.top();
 46         if (nd.v == 0)
 47             return nd.t;
 48         Q.pop();
 49         for (i=0; i<m; ++i) {
 50             v = nd.v;
 51             if ((v&patch[i].bm)!=0 || (v&patch[i].bp)!=patch[i].bp)
 52                 continue;
 53             v |= patch[i].ap;
 54             v &= (~patch[i].am);
 55             t = nd.t + patch[i].t;
 56             if (t < visit[v]) {
 57                 Q.push(node_t(v, t));
 58                 visit[v] = t;
 59             }
 60         }
 61     }
 62     
 63     return -1;
 64 }
 65 
 66 int main() {
 67     int t = 0;
 68     int i, j, k;
 69     
 70     #ifndef ONLINE_JUDGE
 71         freopen("data.in", "r", stdin);
 72         freopen("data.out", "w", stdout);
 73     #endif
 74     
 75     while (scanf("%d%d",&n,&m)!=EOF && (n||m)) {
 76         for (i=0; i<m; ++i) {
 77             scanf("%d %s %s", &patch[i].t, bs, as);
 78             patch[i].bp = patch[i].bm = patch[i].ap = patch[i].am = 0;
 79             // handle before str
 80             for (j=0; j<n; ++j) {
 81                 if (bs[j] == '+')
 82                     patch[i].bp |= (1 << (n-1-j));
 83                 else if (bs[j] == '-')
 84                     patch[i].bm |= (1 << (n-1-j));
 85                 
 86             }
 87             // handle after str
 88             for (j=0; j<n; ++j) {
 89                 if (as[j] == '+')
 90                     patch[i].ap |= (1 << (n-1-j));
 91                 else if (as[j] == '-')
 92                     patch[i].am |= (1 << (n-1-j));
 93                 
 94             }
 95         }
 96         k = bfs();
 97         if (k < 0)
 98             printf("Product %d\nBugs cannot be fixed.\n\n", ++t);
 99         else
100             printf("Product %d\nFastest sequence takes %d seconds.\n\n", ++t, k);
101     }
102     
103     return 0;
104 }

 

posted on 2015-02-19 20:47  Bombe  阅读(187)  评论(0编辑  收藏  举报

导航