这道题用到了很多知识点, 是一道好题目。
     第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后
涉及到了一些位运算。
    第二这里是隐式图搜索, 和之前有一道bfs倒水的有点像, 就是题目和图论没有半毛钱关系, 但是却可以自己建
图来做, 把状态看作点, 把状态转移看作边。
   第三因为求最短时间, 所以用了堆优化dijsktra。

#include<cstdio>
#include<queue>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 20;
const int MAXM = 112;
int t[MAXN], d[1<<MAXN], n, m;
char pre[MAXM][MAXN + 5], aft[MAXM][MAXN + 5];
struct node
{
int u, w;
node(int u = 0, int w = 0) : u(u), w(w) {}
bool operator < (const node& rhs) const
{
return w > rhs.w;
}
}; int solve()
{
REP(i, 0, 1 << n) d[i] = (i == ((1 << n) - 1) ? 0 : 1e9);
priority_queue<node> q;
q.push(node((1 << n) - 1, 0)); while(!q.empty())
{
node x = q.top(); q.pop();
if(x.u == 0) return x.w;
int u = x.u;
if(x.w != d[u]) continue; REP(i, 0, m)
{
int ok = true;
REP(j, 0, n) //相当于判断是否可以走当前这条边,相当于遍历与当前点连接的边
{
if(pre[i][j] == '+' && !(u & (1 << j))) { ok = false; break; }
if(pre[i][j] == '-' && (u & (1 << j))) { ok = false; break; }
}
if(!ok) continue; node v = node(u, x.w + t[i]);
REP(j, 0, n) //相当于达到新的点
{
if(aft[i][j] == '+') v.u |= (1 << j); //把当前位变为1
if(aft[i][j] == '-') v.u &= ~(1 << j); //把当前位变成0
} if(d[v.u] < 0 || v.w < d[v.u]) //松弛
{
d[v.u] = v.w;
q.push(v);
}
}
} return -1;
} int main()
{
int kase = 0;
while(~scanf("%d%d", &n, &m) && n && m)
{
REP(i, 0, m) scanf("%d%s%s", &t[i], pre[i], aft[i]);
int ans = solve();
printf("Product %d\n", ++kase);
if(ans < 0) printf("Bugs cannot be fixed.\n\n");
else printf("Fastest sequence takes %d seconds.\n\n", ans);
}
return 0;
}

最新文章

  1. 完全删除TFS2013上的项目
  2. 《Caffe下跑AlxNet之数据处理过程》
  3. CF380C. Sereja and Brackets[线段树 区间合并]
  4. 什么是FOUC?如何避免FOUC?
  5. UVa 11971 Polygon (数学,转化)
  6. oracle 10g升级到11g
  7. Linux 循环设备 /dev/loop 解惑
  8. MagicalRecord(简化CoreData操作)
  9. 4.1. 如何在Windows环境下开发Python
  10. asp.net mvc中html helper的一大优势
  11. jinja2 把文本变成html
  12. ORACLE提交事务回滚
  13. 中断 LET′S TRY“嵌入式编程”: 5 of 6
  14. Linux:去除每一行行首的空格
  15. SpringMvc请求处理流程与源码探秘
  16. (三)Sass和Compass--制作精灵图片
  17. 【Linux】【Jenkins】Jenkins安装和配置等
  18. C/C++之单例模式实现
  19. spring boot 启动方式
  20. C_文件包含.h文件和包含.c文件总结

热门文章

  1. -ms-,-moz-,-webkit-,-o-含义及各浏览器内核整理
  2. [LUOGU]3919 【模板】可持久化数组
  3. Vue.js 笔记之 img src
  4. 虚拟机安装mac
  5. 详解 QT 主要类 QWidget
  6. pytorch 3 activation 激活函数
  7. [BZOJ1975]HH去散步 图论+矩阵
  8. MapReduce运行流程具体解释
  9. HDU 5416 CRB and Tree (2015多校第10场)
  10. Woody的Python学习笔记2