软件补丁问题(SPFA+位运算)
洛谷P2761 1.考虑到所有的错误只有“修复,未修复”两种情况,所以可以用0,1标记压缩状态,采用位运算减少时空浪费。 又考虑到有修复时间的关系,将时间抽象成边,将状态抽象为点(设修复为0,未修复为1)最后从(1<<n)-1开始寻找到0的最短路,SPFA一边建图一边松弛即可。
2.实现过程中,难点在于对二进制表示,以及位运算组合判断的处理。 首先,状态要表示(见前); 其次,补丁b,f要表示。 最初考虑用两个数来表示b,f,发现受“不动错误”影响,无法转移运算。故采用四个数记录,b+,b-,f+,f-。再推倒出位运算判断方式,以及转移方式即可。
最终位运算方式: 判断:b+:(原状态~)&bp为0可以通过 b-:&为0可以通过 转移(更新)f+:| f-:(fj取反)&原状态
另:b+b-f+f-定义比较繁琐,利用草稿纸码上条件思路比较省事。
附代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int hd=,tl=;
int q[];
bool vis[];
int dis[];
struct repair{
int t;
int bp,bj,fp,fj;
}bu[];
int main()
{
char kk[];
char h;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d ",&bu[i].t);
for(int j=;j<=n;j++)
{
h=getchar();
if(h=='+') bu[i].bp+=<<(n-j);
if(h=='-') bu[i].bj+=<<(n-j);
}
h=getchar();
for(int j=;j<=n;j++)
{
h=getchar();
if(h=='+') bu[i].fp+=<<(n-j);
if(h=='-') bu[i].fj+=<<(n-j);
}
}
//for(int i=1;i<=m;i++)
//cout<<bu[i].t<<" "<<bu[i].bp<<" "<<bu[i].bj<<" "<<bu[i].fp<<" "<<bu[i].fj<<endl;
//cout<<endl;
q[++tl]=(<<n)-;
memset(dis,0x3f3f3f3f,sizeof dis);
dis[(<<n)-]=;
while(hd<=tl)
{
int zhuang=q[hd];hd++;vis[zhuang]=;
//cout<<zhuang<<" "<<dis[zhuang]<<endl;
for(int i=;i<=m;i++)
{
if(((~zhuang)&bu[i].bp)!=) continue;
if((zhuang&bu[i].bj)!=) continue;
//cout<<"panduan "<<i<<" && "<<zhuang<<" == "<<(zhuang&bu[i].bj)<<endl;
int tt=(zhuang|bu[i].fp);
tt=(tt&(~bu[i].fj));
if(dis[tt]>dis[zhuang]+bu[i].t)
{ dis[tt]=dis[zhuang]+bu[i].t;
//cout<<"gengxin "<<i<<" -> "<<tt<<" "<<dis[tt]<<endl;
if(!vis[tt])
{
vis[tt]=;
q[++tl]=tt;
}
}
}
}
if(dis[]==0x3f3f3f3f) printf("");
else printf("%d",dis[]);
return ;
}
总结:位运算一定要自己手动考虑,谁都可以看懂,但是有时候不容易想。
注意位运算优先级。
软件补丁问题(SPFA+位运算)的更多相关文章
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- 洛谷P2761 软件补丁问题 [状压DP,SPFA]
题目传送门 软件补丁问题 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又 ...
- It's not a Bug, It's a Feature! (poj 1482 最短路SPFA+隐式图+位运算)
Language: Default It's not a Bug, It's a Feature! Time Limit: 5000MS Memory Limit: 30000K Total Su ...
- 洛谷 P2761 软件补丁问题 【spfa】
-为什么最短路的题会出现在网络流24里?? 因为范围是15所以直接把每个状态作为一个点,向它能转移到的点连有向边即可.可以不用建图(据说建图存不下?),直接枚举m个转移方案.位运算比较麻烦注意不要写错 ...
- P2761 软件补丁问题
P2761 软件补丁问题 思路 貌似不用网络流,直接状态压缩 用spfa跑最短路,直接判断是否能过 位运算太渣了,WA了好几发 代码 #include <bits/stdc++.h> us ...
- 【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- [luoguP2761] 软件补丁问题(状压最短路)
传送门 n <= 20 很小 所以可以状态压缩 然后因为可能存在环,所以不能DP 那么就用spfa找最短路 被位运算坑了,不清楚优先级一定要加括号 ——代码 #include <queue ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
随机推荐
- Java线程的5种状态及切换(透彻讲解)-京东面试
一.Thread的几个重要方法: 我们先了解一下Thread的几个重要方法. a.start()方法,开始执行该线程:b.stop()方法,强制结束该线程执行:c.join方法,等待该线程结束.d.s ...
- 原 线程池中shutdown()和shutdownNow()方法的区别
参考:shutdown和shutdownNow的区别 shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态.此时,则不能再往线程池中添加任何任务,否则将会抛出Reje ...
- 使Python中的turtle模块画图两只小羊
turtle.circle(radius, extent=None, steps=None) 描述: 以给定半径画圆 参数: radius(半径); 半径为正(负),表示圆心在画笔的左边(右边)画圆 ...
- python好文章
http://blog.csdn.net/csdnnews/article/details/78557392
- ES 6 系列 - 赋值的新方式:解构赋值
变量的解构赋值 es 6 允许按照一定的模式,从数组和对象中提取值,然后对变量进行赋值,这被称之为解构: 一.数组的解构赋值 最基本写法: let [a, b, c] = [1, 2, 3]; a / ...
- Nginx 负载均衡一致性算法
一般Hash负载算法都是%算法 比如key-5 如果有5台服务器 那么5%5=0 那么请求将落在server 0 上,当有服务器宕机或者添加新服务器时,hash算法会引发大量路由更改,可能导致缓存大 ...
- 洛谷 P1484 种树
题目描述 cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种k棵树 ...
- Qt 事件
Qt 的事件处理,实际上是有五个层次: 重写 paintEvent().mousePressEvent() 等事件处理函数.这是最普通.最简单的形式,同时功能也最简单. 重写 event() 函数.e ...
- Node.js机制及原理理解初步【转】
一.node.js优缺点 node.js是单线程. 好处就是 1)简单 2)高性能,避免了频繁的线程切换开销 3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低 3)线程安全,没有加锁. ...
- Spring IOC注入接口多实现解决
前期面试的时候被面试官问到,Spring注入某接口,而接口有多实现,应该如何处理.接口多实现很常见,但在业务逻辑开发中,需要考虑注入某接口的多个实现问题的情况并不多见.当时是一脸懵逼,目前有时间,就做 ...