[luoguP2761] 软件补丁问题(状压最短路)
n <= 20 很小
所以可以状态压缩
然后因为可能存在环,所以不能DP
那么就用spfa找最短路
被位运算坑了,不清楚优先级一定要加括号
——代码
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#define M 301
#define N 4000001 int n, m;
int b1[M], b2[M], f1[M], f2[M], a[M], dis[N];
bool vis[N]; inline void spfa()
{
int i, v, u;
std::queue <int> q;
memset(dis, 0x33, sizeof(dis));
q.push(( << n) - );
dis[( << n) - ] = ;
while(!q.empty())
{
u = q.front(), q.pop();
vis[u] = ;
for(i = ; i <= m; i++)
if((u | b1[i]) == u && !(u & b2[i]))
{
v = u ^ (u & f1[i]) | f2[i];
if(dis[v] > dis[u] + a[i])
{
dis[v] = dis[u] + a[i];
if(!vis[v])
{
q.push(v);
vis[v] = ;
}
}
}
}
} int main()
{
int i, j;
char s1[M], s2[M];
scanf("%d %d", &n, &m);
for(i = ; i <= m; i++)
{
scanf("%d %s %s", &a[i], s1, s2);
for(j = ; j < n; j++)
{
if(s1[j] == '+') b1[i] |= << j;
if(s1[j] == '-') b2[i] |= << j;
if(s2[j] == '-') f1[i] |= << j;
if(s2[j] == '+') f2[i] |= << j;
}
}
spfa();
dis[] == dis[ << n] ? puts("") : printf("%d\n", dis[]);
return ;
}
[luoguP2761] 软件补丁问题(状压最短路)的更多相关文章
- 洛谷P2761 软件补丁问题 [状压DP,SPFA]
题目传送门 软件补丁问题 题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又 ...
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...
- P4854 MloVtry的咸鱼树 状压+最短路
$ \color{#0066ff}{ 题目描述 }$ 俗话说种瓜得瓜,种豆得豆,MloVtry把自己砍掉一半埋进了土里,于是它得到了一颗n个点的咸鱼树. 但是问题是由于MloVtry只舍得埋下一半的自 ...
- [luoguP2622] 关灯问题II(状压最短路)
传送门 本以为是状压DP,但是有后效性. 所以写一手状压spfa #include <queue> #include <cstdio> #include <cstring ...
- BZOJ 1097: [POI2007]旅游景点atr [DP 状压 最短路]
传送门 题意: 一个无向图,从$1$到$n$,要求必须经过$2,3,...,k+1$,给出一些限制关系,要求在经过$v \le k+1$之前必须经过$u \le k+1$ 求最短路 预处理出$1... ...
- bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
- luogu2761 软件补丁问题
状压最短路 #include <iostream> #include <cstring> #include <cstdio> #include <queue& ...
- 洛谷P2761 软件补丁问题(状压dp)
传送门 啊咧……这题不是网络流二十四题么……为啥是个状压dp…… 把每一个漏洞看成一个状态,直接硬上状压dp 然后因为有后效型,得用spfa //minamoto #include<iostre ...
- 【CodeVS2800】 送外卖 最短路+状压DP
首先求出各点之间的最短路,floyed即可,注意是0-n. 然后考虑状压,f[i][j]表示状态为i时访问j点时的最短路和,1表示访问,0表示未访问,然后第j个点所在的位置就是(1<<j) ...
随机推荐
- Android(java)学习笔记115:BroadcastReceiver之 Android广播机制
Android广播机制 android系统中有各式各样的广播,各种广播在Android系统中运行,当"系统/应用"程序运行时便会向Android注册各种广播.Android接收到广 ...
- Failed to load property source from location 'classpath:/applica)
: 1.注释错误(application.yml用的是#注释) 2.缩进采用tab而不是空格引起的(不同配置之间也不能有tab出现,否则会报错) 3.冒号后面必须有空格否则会报错
- PWD简介与妙用(一个免费、随时可用的Docker实验室)
转载自 https://baiyue.one/archives/472.html 本文介绍下 PWD 的历史,并依据本站最近学习心得,经过多次尝试,终于打通了 Docker 与常规宝塔面板搭建,因此, ...
- Problem A: 文件操作--二进制文件读入
Problem A: 文件操作--二进制文件读入 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1952 Solved: 524[Submit][St ...
- 10分钟搞懂toString和valueOf函数(详细版)
首先要说明的是这两种方法是toPrimitive抽象操作里会经常用到的. 默认情况下,执行这个抽象操作时会先执行valueOf方法,如果返回的不是原始值,会继续执行toString方法,如果返回的还不 ...
- 在Python中使用help帮助
在Python中使用help帮助 >>> import numpy >>> help(numpy.argsort) Help on function argsort ...
- git使用stash存储相关操作
git stash 将当前修改存储起来 git stash apply 恢复最近一次存储 git stash apply stash@{2} 恢复某一次存储 git stash list 查看存储列 ...
- 【上下界网络流 二分】bzoj2406: 矩阵
感觉考试碰到上下界网络流也还是写不来啊 Description Input 第一行两个数n.m,表示矩阵的大小. 接下来n行,每行m列,描述矩阵A. 最后一行两个数L,R. Output 第一行,输出 ...
- Voyager下的Media Manager文件管理与Menu Builder
Media Manager 默认存储位置在storage/app/public 上传文件,新建文件夹,移动,重命名,删除等等等功能 Menu Builder 创建新的Main菜单 创建一个shop菜单 ...
- Oracle rownum的理解
核心过程分三步: 从表中取出行(无索引的话,顺序取出). 根据当前结果集,为当前行添加rownum. 条件筛选,如通过则添加到结果集中. 完.