[luoguP2761] 软件补丁问题(状压最短路)
2017-06-04 14:26
351 查看
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 ; bool vis ; inline void spfa() { int i, v, u; std::queue <int> q; memset(dis, 0x33, sizeof(dis)); q.push((1 << n) - 1); dis[(1 << n) - 1] = 0; while(!q.empty()) { u = q.front(), q.pop(); vis[u] = 0; for(i = 1; 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] = 1; } } } } } int main() { int i, j; char s1[M], s2[M]; scanf("%d %d", &n, &m); for(i = 1; i <= m; i++) { scanf("%d %s %s", &a[i], s1, s2); for(j = 0; j < n; j++) { if(s1[j] == '+') b1[i] |= 1 << j; if(s1[j] == '-') b2[i] |= 1 << j; if(s2[j] == '-') f1[i] |= 1 << j; if(s2[j] == '+') f2[i] |= 1 << j; } } spfa(); dis[0] == dis[1 << n] ? puts("0") : printf("%d\n", dis[0]); return 0; }View Code
相关文章推荐
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
- 洛谷P2761 软件补丁问题(状压dp)
- 【网络流24题】 No.12 软件补丁问题(最小转移代价 最短路)
- 【网络流24题】软件补丁问题(最短路)
- [luoguP2622] 关灯问题II(状压最短路)
- [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
- 网络流二十四题之十二 —— 软件补丁问题(BUG)
- 洛谷 P2761 软件补丁问题 【spfa】
- P2761 软件补丁问题
- P2761 软件补丁问题
- 解决局域网内微软防病毒软件不能更新补丁的问题
- 网络流24题之软件补丁问题
- 软件补丁问题([网络流24题之12])[状态压缩+最短路径]
- 网络流24题之T12 软件补丁问题
- luogu1527补丁VS错误、luogu2716软件补丁问题
- 洛谷P2761:软件补丁问题
- SCCM2012软件更新(WSUS补丁)同步成功无法获取补丁问题
- 【网络流24题】软件补丁问题
- 【网络流24题----12】软件补丁问题
- [网络流24题] 软件补丁问题