zoukankan      html  css  js  c++  java
  • 【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
    Bugs cannot be fixed.
    
    ", ++t);
     99         else
    100             printf("Product %d
    Fastest sequence takes %d seconds.
    
    ", ++t, k);
    101     }
    102     
    103     return 0;
    104 }
  • 相关阅读:
    二、跳转指定页面的JS代码
    一、常规的JS页面跳转代码
    您在前一家公司的离职原因是什么?
    如果你在这次面试中没有被录用,你怎么打算?
    如果你在这次面试中没有被录用,你怎么打算?
    针对你们单位业务工作中出现的问题,你提出了一些很好的建议,得到了同事们的赞同,但你的领导并不满意。在这种情况下,你怎么办?
    进程与线程的区别
    work13
    work12
    day09
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4296281.html
Copyright © 2011-2022 走看看