[题解]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.对于每个补丁 ...
随机推荐
- leeetcode 20. 有效的括号
20. 有效的括号 问题描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的 ...
- Parallel.For实现
static class MyParallel { //4.0及以上用Task, Task的背后的实现也是使用了线程池线程 //static List<Task> tasks = new ...
- golang中的runtime包
1. runtime.Gosched 让出CPU时间片,重新等待安排任务 package main import ( "fmt" "runtime" ) fu ...
- Qt中编译器
很多时候,Qt构建项目编译的过程中会报错,大部分报错是因为qt的设置出现问题,很多时候环境配置时要选择合适的编译器,debugger调试器等,这里对一些名词解释,内容对新手很友好,大佬就不用看啦. M ...
- python28day
内容回顾 classmethod: 用不到对象,并且要用类名的时候 装饰一个方法,被装饰的方法会变成类方法 staticmethod: 把一个函数放到类里,变成一个静态方法 这个方法既用不到对象,也用 ...
- Python3.7.3 + pycharm安装
Python3.7.3下载地址: https://www.python.org/ https://www.python.org/getit/ Pycharm: http://www.jetbrains ...
- python3调用js的库之execjs
执行JS的类库:execjs,PyV8,selenium,node execjs是一个比较好用且容易上手的类库(支持py2,与py3),支持 JS runtime. 1.安装: pip install ...
- java 变量的定义 类型转换 基本的数据类型
package com.aaa.zxf.ajax.test; import org.junit.Test; /** * 六. * 如何在ideal的maven项目中导入 Test 测试类? * * * ...
- Redis学习笔记(三)redis 的键管理
Redis 的键管理 一.Redis 数据库管理 Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 ...
- 新一代Python包管理工具来了
1 简介 说起Python的包管理工具,大家第一时间想到的肯定是pip.conda等经典工具.但最近我发现了一款新颖的Python包管理工具--pdm,它受到PEP582(https://www.py ...