[题解]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.对于每个补丁 ...
随机推荐
- leetcode 921. 使括号有效的最少添加
问题描述 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字符 ...
- Xamarin/Unity3d无法访问Azure服务器或者微软API
Xamarin因为是mono项目的商用版,mono项目是.net技术的开源修改版,所以和微软的服务对接时候会出现安全验证问题. mono项目本质是对汇编级的中间语言二次编译.可参考公共语言运行时相关知 ...
- T-SQL的存储过程
1.简介 存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时 ...
- Anchor CMS 0.12.7 跨站请求伪造漏洞(CVE-2020-23342)
这个漏洞复现相对来说很简单,而且这个Anchor CMS也十分适合新手训练代码审计能力.里面是一个php框架的轻量级设计,通过路由实现的传递参数. 0x00 漏洞介绍 Anchor(CMS)是一款优秀 ...
- golang中的sync
1. Go语言中可以使用sync.WaitGroup来实现并发任务的同步 package main import ( "fmt" "sync" ) func h ...
- /etc/passwd详解
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/n ...
- Mongodb全备+增备+oplog恢复误删数据
此时测试表中有7条数据,做个全备. 全备: mongodump --host=192.168.43.43 --port=37017 --oplog --out=/opt/mongo/fullbacku ...
- 基于 esbuild 的 universal bundler 设计
--字节跳动前端 Byte FE :杨健 背景 由于 Lynx(公司自研跨端框架)编译工具和传统 Web 编译工具链有较大的差别(如不支持动态 style 和动态 script 基本告别了 bundl ...
- css3有趣的transform形变
在CSS3中,transform属性应用于元素的2D或3D转换,可以利用transform功能实现文字或图像的旋转.缩放.倾斜.移动这4中类型的形变处理 语法: div{ transform: non ...
- React之redux学习日志(redux/react-redux/redux-saga)
redux官方中文文档:https://www.redux.org.cn/docs/introduction/CoreConcepts.html react-redux Dome:https://co ...