【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 }