思路:通过前后两种状态建立一条边,利用Dijsktra就可以做了。
注意利用二进制优化。
AC代码
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = (1 << 20) + 5, maxm = 100 + 5; int n, m, d[maxn], vis[maxn]; char before[maxm][25], after[maxm][25]; int cost[maxm]; struct Node{ int bug, dist; Node(){} Node(int bug, int dis):bug(bug),dist(dis){} bool operator < (const Node& p) const { return dist > p.dist; } }; int Dijsk(int u) { memset(d, inf, sizeof(d)); memset(vis, 0, sizeof(vis)); priority_queue<Node>Q; Q.push(Node(u, 0)); d[u] = 0; while(!Q.empty()) { Node p = Q.top(); Q.pop(); int u = p.bug; if(u == 0) return d[u]; if(vis[u]) continue; vis[u] = 1; for(int i = 0; i < m; ++i) { bool ok = true; for(int j = 0; j < n; ++j) { if(before[i][j] == '+' && !(u & (1 << j))) {ok = false; break;} if(before[i][j] == '-' && (u & (1 << j))) {ok = false; break;} } if(!ok) continue; //不能打补丁 Node v = Node(u, p.dist + cost[i]); for(int j = 0; j < n; ++j) { if(after[i][j] == '-') v.bug &= ~(1 << j); if(after[i][j] == '+') v.bug |= (1 << j); } if(v.dist < d[v.bug] || d[v.bug] < 0) { d[v.bug] = v.dist; Q.push(v); } } } return -1; } int main() { int kase = 0; while(scanf("%d%d", &n, &m) == 2 && n && m) { for(int i = 0; i < m; ++i) { scanf("%d%s%s", &cost[i], before[i], after[i]); } int ans = Dijsk((1 << n) - 1); printf("Product %d\n", ++kase); if(ans == -1) printf("Bugs cannot be fixed.\n"); else printf("Fastest sequence takes %d seconds.\n", ans); printf("\n"); } return 0; }
如有不当之处欢迎指出!
UVA - 658 最短路的更多相关文章
-
UVA - 658 It&#39;s not a Bug, it&#39;s a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
-
UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (最短路,经典)
题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了: ...
-
状态转移的最短路 隐式图搜索 UVA 658
紫书365 题目大意:给你n个全都是bug的东西,然后每次可以修复,给你修复前后的状态,问最后如果能把bug全都修复,最少需要多少时间. 思路:从最初状态开始,然后枚举bug即可. 表示priorit ...
-
紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ...
-
uva 11374 最短路+记录路径 dijkstra最短路模板
UVA - 11374 Airport Express Time Limit:1000MS Memory Limit:Unknown 64bit IO Format:%lld & %l ...
-
UVA 658 状态压缩+隐式图+优先队列dijstla
不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...
-
uva 10269 最短路
求两次最短路 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
-
UVa 658 (Dijkstra) It&#39;s not a Bug, it&#39;s a Feature!
题意: 有n个BUG和m个补丁,每个补丁用一个串表示打补丁前的状态要满足的要求,第二个串表示打完后对补丁的影响,还有打补丁所需要的时间. 求修复所有BUG的最短时间. 分析: 可以用n个二进制位表示这 ...
-
UVA 658	 It&#39;s not a Bug, it&#39;s a Feature!
这个题目巧妙之处在于用二进制的每个位1,0分别表示bug的有无,以及实施补丁对相应bug的要求以及实施后的对bug的影响. 软件bug的状态:1表示相应bug仍然存在,0表示已经修复.这样可以将软件的 ...
随机推荐
-
升级nodejs版本
node有一个模块叫n,是专门用来管理node.js的版本的. 首先安装n模块: npm install -g n 第二步: 升级node.js到最新稳定版 n stable n后面也可以跟随版本号比 ...
-
用DOS命令打开IE浏览器、我的文档等等
用DOS命令打开IE浏览器 在“start”-运行中直接输入网址就可以了.如输入百度: http://www.baidu.com Command:[ start http://www.baidu.c ...
-
apscheduler 排程
https://apscheduler.readthedocs.org/en/v2.1.2/cronschedule.html 参数 说明 year 4位年 month 月份1-12 day 日:1- ...
-
开启mysql慢查询
Linux查看mysql 安装路径一.查看文件安装路径由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址).这里以mysql为例.比如说我安装了mysql,但是不知道文件都安装在哪些 ...
-
CDNJS:使用JavaScript CDN加速网站载入速度
先介绍一下: 内容传递网络(CDN)或者叫内容分发网络,他的作用是给不同区域的访客以其最快的网速.比如,你的网站是开在美国的,但很多访客来自中国,无疑他们会觉得速度很慢,那么,怎么为他们提速呢?简单来 ...
-
input placeholder文字垂直居中(Mobile &; PC)
Html5输入框支持placeholder,但是在定义文本框中定义placeholder存在兼容问题 <input type="text" placeholder=" ...
-
robot framework 使用四:分层设计和截图以及注意事项
再说一下眼下的主要环境信息和版本号: 操作系统:win7 64位 python版本号:2.7.6 RIDE版本号:1.2.3 selenium2library:1.5.0 selenium:2.40. ...
-
ES6 new syntax of Arrow Function
Arrow Function.md Arrow Functions The basic syntax of an arrow function is as follows var fn = data ...
-
利用SSL-Change Cipher Spec传递信息
Change Cipher Spec 中文翻译为 更改密码规格. 恢复原有会话的SSL握手过程流程如下: 关于如何用Change Cipher Spec传输数据,可以扩展tcp.payload. tc ...
-
Vue --1
1.2 vue.js库的基本使用 在github下载:https://github.com/vuejs/vue/releases 在官网下载地址: https://cn.vuejs.org/v2/gu ...