【最短路】【位运算】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两个公司能够搭建 ...
随机推荐
- chrome表单自动填充导致input文本框背景变成偏黄色问题
你曾遇到过吗? 困扰宝宝好久的问题,本以为是什么插件导致的,结果是chrome浏览器自动填充文本时默认的样式,搜嘎. 一.修改自动填充input文本框背景色: 使用以下代码 可以设置自己的想要的默认文 ...
- Python模块学习 - Fileinput
Fileinput模块 fileinput是python提供的标准库,使用fileinput模块可以依次读取命令行参数中给出的多个文件.也就是说,它可以遍历 sys.argv[1:],并按行读取列表中 ...
- Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
A code sequence made up multiple instructions and specifying an offset from a base address is identi ...
- bind类成员函数
首先描述一个情景: 先贴出代码: class Solution { public: bool compare(int a, int b) { return a > b; } int functi ...
- appium===登陆应用的案例
import time import os from appium import webdriver from selenium.webdriver.support.ui import WebDriv ...
- linux和ubuntu防火墙相关命令
1.永久有效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2.即刻生效 开启: service iptables start 关闭: se ...
- [Think] position与anchorPoint关系
1.简介: 最近在学习动画,所以接触到了CAlayer类. 其中的position与anchorPoint关系一感觉一头雾水,网上有篇文章 彻底理解position和anchorPoint关系 里面 ...
- 1.ubuntu的安装
分两种 1. 在VMware中安装,则与Centos的安装类似 2. 在VirtualBox里安装 --> 1. 先“新建” 一个虚拟电脑 2. 根据需求编辑虚拟电脑的信息 (具体的大小.内存等 ...
- APP运营
产品相关术语 APP:application的简写,即应用. 开发商:也叫CP,即ContentProvider内容提供商. 发行商(运营商):代理CP开发出来的产品. 联运:CP和渠道联合运营产品. ...
- Restful Framework (三)
目录 一.版本 二.解析器 三.序列化 四.请求数据验证 一.版本 回到顶部 程序也来越大时,可能通过版本不同做不同的处理 没用rest_framework之前,我们可以通过以下这样的方式去获取. c ...