[题解]UVA658 It's not a Bug, it's a Feature!
链接:http://vjudge.net/problem/viewProblem.action?id=22169
描述:有n个漏洞,m个修复漏洞的方法,每种方法耗时不一样,求修复漏洞的最短时间。每种方法的使用对当前漏洞分布的状态有要求,符合要求才能修复,并有可能引入新漏洞。
思路:单源点最短路
这道题卡了我很久,因为不知道怎么表示状态。最开始受到'0'的影响,觉得必须要三进制,于是写得很麻烦还错了。之后觉得可以用二进制分别存储'+'和'-'的状态。我定义两个数组,Condition[i][0]表示第i个方法'+'要满足的条件,Condition[i][1]表示第i个方法'-'要满足的条件;Operate[i][0]和Operate[i][1]同理表示修复手段。
判断当前状态Cur是否可以用第i个方法:(可以自己举个例子推一下)
Cur&Condition[i][0])==Condition[i][0]
((~Cur)&Condition[i][1])==Condition[i][1]
用第i个方法修复漏洞:
Cur|=Operate[i][0];
Cur&=(~Operate[i][1]);
然后的问题就是,状态量太多了,或者说是无效的状态量太多了,怎么解决存储问题呢?这个时候我们就考虑不存边,在搜索的时候按照判断结果走,相当于是动态找状态。然后一个bfs就解决问题了。
我的实现:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <queue>
5 using namespace std;
6 #define MaxM 120
7 #define MaxN 30
8 int Cost[MaxM],Condition[MaxM][5],Operate[MaxM][5];
9 char s1[MaxN],s2[MaxN];
10 bool vis[(1<<20)+20];
11 int n,m,ans;
12 bool Sol;
13 typedef pair<int, int> p;
14 struct cmp
15 {
16 bool operator()(p a,p b)
17 {
18 return a.first>b.first;
19 }
20 };
21 priority_queue <p, vector<p>, cmp> q;
22 inline void Clean()
23 {
24 memset(Condition,0,sizeof(Condition));
25 memset(Operate,0,sizeof(Operate));
26 Sol=false;
27 memset(vis,false,sizeof(vis));
28 while(!q.empty())
29 q.pop();
30 }
31 void Bfs()
32 {
33 q.push(make_pair(0,(1<<n)-1));
34 p u;
35 int i,fi,Cur;
36 while(!q.empty())
37 {
38 u=q.top();q.pop();
39 fi=u.first;Cur=u.second;
40 if(!Cur)
41 {
42 Sol=true;
43 ans=fi;
44 return;
45 }
46 if(vis[Cur])
47 continue;
48 vis[Cur]=true;
49 for(i=1;i<=m;++i)
50 {
51 Cur=u.second;
52 if((Cur&Condition[i][0])==Condition[i][0]&&((~Cur)&Condition[i][1])==Condition[i][1])
53 {
54 Cur|=Operate[i][0];
55 Cur&=(~Operate[i][1]);
56 q.push(make_pair(fi+Cost[i],Cur));
57 }
58 }
59 }
60 }
61 int main()
62 {
63 int i,j,t;
64 for(t=1;;t++)
65 {
66 Clean();
67 scanf("%d%d",&n,&m);
68 if(n==0&&m==0)
69 break;
70 for(i=1;i<=m;++i)
71 {
72 scanf("%d%s%s",&Cost[i],s1,s2);
73 for(j=0;j<n;++j)
74 {
75 if(s1[j]=='+')
76 Condition[i][0]|=(1<<j);
77 else if(s1[j]=='-')
78 Condition[i][1]|=(1<<j);
79 }
80 for(j=0;j<n;++j)
81 {
82 if(s2[j]=='+')
83 Operate[i][0]|=(1<<j);
84 else if(s2[j]=='-')
85 Operate[i][1]|=(1<<j);
86 }
87 }
88 Bfs();
89 printf("Product %d\n",t);
90 if(Sol)
91 printf("Fastest sequence takes %d seconds.\n\n",ans);
92 else
93 printf("Bugs cannot be fixed.\n\n");
94 }
95 return 0;
96 }
[题解]UVA658 It's not a Bug, it's a Feature!的更多相关文章
- 【最短路】【位运算】It's not a Bug, it's a Feature!
[Uva658] It's not a Bug, it's a Feature! 题目略 UVA658 Problem PDF上有 试题分析: 本题可以看到:有<=20个潜在的BUG,那 ...
- [有意思]The IT workers of Star Wars -- That's not a bug. It's a feature
Yeah, that Artoo is kinda mouthy... ... now select, "restore to factory settings." That'll ...
- poj1483 It's not a Bug, It's a Feature!
It's not a Bug, It's a Feature! Time Limit: 5000MS Memory Limit: 30000K Total Submissions: 1231 ...
- 洛谷 题解 UVA658 【这不是bug,而是特性 It's not a Bug, it's a Feature!】
[题意] 补丁在修正\(BUG\)时,有时也会引入新的\(BUG\),假定有\(n(n<=20)\)个潜在\(BUG\),和\(m(m<=100)\)个补丁,每个补丁用两个长度为\(n\) ...
- UVA 658 It's not a Bug, it's a Feature! (最短路,经典)
题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了: ...
- UVa 658 (Dijkstra) It's not a Bug, it's a Feature!
题意: 有n个BUG和m个补丁,每个补丁用一个串表示打补丁前的状态要满足的要求,第二个串表示打完后对补丁的影响,还有打补丁所需要的时间. 求修复所有BUG的最短时间. 分析: 可以用n个二进制位表示这 ...
- UVA 658 It's not a Bug, it's a Feature!
这个题目巧妙之处在于用二进制的每个位1,0分别表示bug的有无,以及实施补丁对相应bug的要求以及实施后的对bug的影响. 软件bug的状态:1表示相应bug仍然存在,0表示已经修复.这样可以将软件的 ...
- UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 658 It's not a Bug, it's a Feature! (状态压缩+Dijstra)
题意:首先给出n和m,表示有n个bug和m个补丁.一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug, 所以目标状态就是n个0.对于每个补丁 ...
随机推荐
- Hybrid App(混合开发) 移动端开发调试
1.下载项目,npm install安装依赖 本地运行 npm run dev(根据具体packjson配 置而定) 2.局域网访问:http://172.20.9.35:8080/ 3.手机端访问: ...
- Parallel.For实现
static class MyParallel { //4.0及以上用Task, Task的背后的实现也是使用了线程池线程 //static List<Task> tasks = new ...
- 【机器学习】GMM和EM算法
机器学习算法-GMM和EM算法 目录 机器学习算法-GMM和EM算法 1. GMM模型 2. GMM模型参数求解 2.1 参数的求解 2.2 参数和的求解 3. GMM算法的实现 3.1 gmm类的定 ...
- JavaWeb概念及Web资源的分类
一,JavaWeb概念 1,JavaWeb,所有通过java语言编写可以通过浏览器访问的程序的总称 JavaWeb是基于请求和响应来开发的. 2,什么是请求 请求:指客户端给服务端发送数据,Reque ...
- 集合框架-Map集合重点方法keySet演示
1 package cn.itcast.p6.map.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import ...
- cnpm安装教程
安装cnpm,输入以下命令: sudo npm install -g cnpm --registry=https://registry.npm.taobao.org 输入cnpm -v ,检测是否正常 ...
- MySQL运维开发之路
MySql h1 { color: rgba(0, 60, 128, 1); text-align: center } h1:hover { color: rgba(0, 255, 111, 1) } ...
- 回顾 2021 中国 .NET 开发者峰会
.NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展.峰会由来自北京.上海.苏州. ...
- ApacheCN Angular 译文集 20211114 更新
Angular 专家级编程 零.前言 一.架构概述和在 Angular 中构建简单应用 二.将 AngularJS 应用迁移到 Angular 应用 三.使用 Angular CLI 生成具有最佳实践 ...
- 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.11
公告 我们始终与所有创作者站在一起,为创作自由而战.我们还会提供一切必要的技术支持. 我们全力支持科研开源(DOCX)计划.希望大家了解这个倡议,把这个倡议与自己的兴趣点结合,做点力所能及的事情. 我 ...