博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tyvj3308毒药解药题解
阅读量:5959 次
发布时间:2019-06-19

本文共 1733 字,大约阅读时间需要 5 分钟。

  • 题目大意

    这些药都有可能在治愈某些病症的同一时候又使人患上某些别的病症……经过我天才的努力。最终弄清了每种药的详细性能,我会把每种药能治的病症和能使人患上的病症列一张清单给你们,然后你们要依据这张清单找出能治愈全部病症的最少药剂组合……顺便说一声,病症的数目不超过10种。我的药是用不完的,就是说每种药剂都能够被反复使用。

  • 题解

    二进制表示患病状态(2n1024种)和每种药的治病与致病状态,然后从2n1到0開始连有向边,然后bfs出最短路就可以。感觉这样对付一道搜索题大材小用了。

  • Code

#include 
#include
#include
#include
using namespace std;const int maxn = 200000, nil = 0, maxm = 21, oo = 1000000000;int n, m, map[maxm][105];int cur[105], inf[105];//cure infectint u[maxn], v[maxn], nxt[maxn], pnt[1 << maxm], e;bool vis[1 << maxm];int d[1 << maxm];void add(int a, int b){ u[++e] = a; v[e] = b; nxt[e] = pnt[a]; pnt[a] = e;}void init(){ int x; scanf("%d%d", &n, &m); for(int i = 1; i <= m; ++i) { for(int j = 1; j <= n; ++j) { scanf("%d", &x); if(x == 1) { cur[i] |= (1 << (j - 1)); } if(x == -1) { inf[i] |= (1 << (j - 1)); } } } for(int i = (1 << n) - 1; i > 0; --i) { for(int j = 1; j <= m; ++j) { add(i, (i & (~cur[j])) | inf[j]); } }}void work(){ queue
Q; memset(d, 0x3f, sizeof(d)); Q.push((1 << n) - 1); d[(1 << n) - 1] = 0; vis[(1 << n) - 1] = true; while(!Q.empty()) { int t = Q.front(); Q.pop(); for(int j = pnt[t]; j != nil; j = nxt[j]) { if(!vis[v[j]]) { d[v[j]] = d[t] + 1; vis[v[j]] = true; Q.push(v[j]); } } } if(d[0] > oo) puts("The patient will be dead."); else printf("%d\n", d[0]);}int main(){ init(); work(); return 0;}

转载地址:http://rxuax.baihongyu.com/

你可能感兴趣的文章
JVM介绍
查看>>
Qt中使用QToolBox实现抽屉效果
查看>>
双活数据中心建设之光大实践
查看>>
张晓辉:大众点评的分布式架构是怎样炼成的
查看>>
张军-大数据的理解与分布式进化计算方法
查看>>
关于Hibernate 查询oracle 字段为Date类型
查看>>
深入学习Java虚拟机之——垃圾收集算法与垃圾收集器
查看>>
android反编译之获得java源代码
查看>>
优盘驱动制作
查看>>
(分享)笔记C#基础知识
查看>>
resin
查看>>
PHP开发工具ZendStudio10
查看>>
wsl搭建php环境请求超时的问题解决方案
查看>>
spring基础
查看>>
微信用户名乱码问题
查看>>
dubbo spi(续)
查看>>
dubbo remoting(2)
查看>>
maya pyside 多个窗口实例 报错 解决
查看>>
关于文件上传请求第一次为post,后面为get的问题
查看>>
【Qt笔记】QDialog--模态和非模态
查看>>