【最短路】【位运算】It's not a Bug, it's a Feature!
[Uva658] It's not a Bug, it's a Feature!
题目略 UVA658 Problem PDF上有
试题分析:
本题可以看到:有<=20个潜在的BUG,那么如果每一个补丁都DFS一下的话肯定炸掉,那么怎么办呢?
我们发现,要在一个最短的时间求出来,而且状态之间可以变换多次,那么DP呢?
DP的话,由于BUG指令可以用0代替,所以我们无从转移,也就是说有后效性(后面的决策可能影响前面的)
那么还有什么此类转移的算法呢?貌似只剩下图论了……
对于每一个补丁之前的样子中的0,我们可以直接枚举(DFS),将它转换为一些2进制数连边建图,然后跑一遍最短路就可以啦。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,M;int t;
char str1[101],str2[101];
int len;char str[101];
int cnt;int Node[3000100],Next[3000100],Root[3000100],Cost[3000100];
int dis[3000100];bool inq[3000100];
int que[3001000]; void add(int u,int v,int w){
cnt++;
Node[cnt]=v;
Cost[cnt]=w;
Next[cnt]=Root[u];
Root[u]=cnt;
return ;
}
void addedge(int sum,int sum2,int k){//将每一个补丁转换为2进制数,将前后状态连边
if(k==len){
add(sum,sum2,t);
return ;
}
if(str2[k]!='0'){
if(str2[k]=='+'){
if(str[k]=='0'){
addedge(sum+(1<<k),sum2+(1<<k),k+1);
addedge(sum,sum2+(1<<k),k+1);
}
else{
if(str[k]=='-') addedge(sum,sum2+(1<<k),k+1);
else addedge(sum+(1<<k),sum2+(1<<k),k+1);
}
return ;
}
else{
if(str[k]=='0'){
addedge(sum+(1<<k),sum2,k+1);
addedge(sum,sum2,k+1);
}
else{
if(str[k]=='-') addedge(sum,sum2,k+1);
else addedge(sum+(1<<k),sum2,k+1);
}
return ;
}
}
else{
if(str[k]=='0'){
addedge(sum+(1<<k),sum2+(1<<k),k+1);
addedge(sum,sum2,k+1);
return ;
}
else
if(str[k]=='-') addedge(sum,sum2,k+1);
else addedge(sum+(1<<k),sum2+(1<<k),k+1);
}
return ;
}
int SPFA(int s,int t){
memset(dis,INF,sizeof(dis));
memset(inq,false,sizeof(inq));
dis[s]=0; inq[s]=true; int tail=1; que[tail]=s;
for(int head=1;head<=tail;head++){
for(int x=Root[que[head]];x;x=Next[x]){
if(dis[Node[x]]>dis[que[head]]+Cost[x]){
dis[Node[x]]=dis[que[head]]+Cost[x];
if(!inq[Node[x]]){
inq[Node[x]]=true;
que[++tail]=Node[x];
}
}
}
inq[que[head]]=false;
}
return dis[t];
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read(),M=read();
for(int i=1;i<=M;i++){
t=read();
cin>>str>>str2;
len=strlen(str);
addedge(0,0,0);
}
printf("%d\n",SPFA((1<<N)-1,0));
return 0;
}
【最短路】【位运算】It's not a Bug, it's a Feature!的更多相关文章
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
- 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 ...
- php位运算的应用(转)
在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参 ...
- C语言位运算
C语言位运算详解 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...
- java中&和&&的区别 位运算
1.1. 逻辑与的运算符功能 1.1.1. 测试&& public static void main(String[] args) { int x=5; if (x==6 && ...
- C语言中的位运算和逻辑运算
这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...
- 软件补丁问题(SPFA+位运算)
洛谷P2761 1.考虑到所有的错误只有“修复,未修复”两种情况,所以可以用0,1标记压缩状态,采用位运算减少时空浪费. 又考虑到有修复时间的关系,将时间抽象成边,将状态抽象为点(设修复为0,未修复为 ...
- Java 基本数据类型 && 位运算
1. Java基本数据类型 1.1 数据类型示意图 类型 字节数 范围 byte 1 -128~127 short 2 -32768~32767 int 4 -231~231-1 long 8 -26 ...
- POJ--2570--Fiber Network【floyd+位运算】
题意:一些公司决定搭建一些光纤网络.单向的,假设从第一点到第二点,有ab两个公司能够搭建,第二点到第三点有ac两个公司能够搭建,第一点到第三点有d公司能够搭建,则第一点到第三点有a.d两个公司能够搭建 ...
随机推荐
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- MapperScannerConfigurer不 property-placeholder
关于org.mybatis.spring.mapper.MapperScannerConfigurer不支持 property-placeholder 参考了http://www.oschina.ne ...
- HTTP响应码摘自apach官网
HTTP状态列表 响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行. 响应码分五种类型,由它们的第一位数字表示: 1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接 ...
- LeetCode 20 Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 448D - Codeforces
D. Multiplication Table time limit per test 1 second memory limit per test 256 megabytes Bizon the C ...
- 【LabVIEW技巧】策略模式
前言 在之前的文章提到了如何学习OOP以及对应的简单工厂模式,由于时间比较长,我们先回顾一下原有内容,然后继续了解新的模式. 为什么学习OOP 在测控系统的软件开发过程中,LabVIEW工程师一直认为 ...
- 包装类、基本数据类型及String类之间的相互转换
包装类:8种基本数据类型对应一个类,此类即为包装类 一.基本数据类型 包装类 及String之间的转换 1.基本数据类型转化为包装类:调用包装类的构造器 int i=10; Inte ...
- 微信小程序实现图片上传,预览,删除
wxml: <view class='imgBox'> <image class='imgList' wx:for="{{imgs}}" wx:for-item= ...
- how to create view (windows)
View Server List IP address: 200.xx.xx.xx How to create a new view ssh new view server by your Unix ...
- Linux平台用C++实现事件对象,同步线程(转)
本文属于转载,原文链接如下:http://blog.csdn.net/chexlong/article/details/7080537 与其相关的一组API包括:pthread_mutex_init, ...