[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!的更多相关文章

  1. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

  2. It&#39;s not a Bug, It&#39;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 ...

  3. php位运算的应用(转)

    在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参 ...

  4. C语言位运算

    C语言位运算详解    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...

  5. java中&和&&的区别 位运算

    1.1. 逻辑与的运算符功能 1.1.1. 测试&& public static void main(String[] args) { int x=5; if (x==6 && ...

  6. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  7. 软件补丁问题(SPFA+位运算)

    洛谷P2761 1.考虑到所有的错误只有“修复,未修复”两种情况,所以可以用0,1标记压缩状态,采用位运算减少时空浪费. 又考虑到有修复时间的关系,将时间抽象成边,将状态抽象为点(设修复为0,未修复为 ...

  8. Java 基本数据类型 && 位运算

    1. Java基本数据类型 1.1 数据类型示意图 类型 字节数 范围 byte 1 -128~127 short 2 -32768~32767 int 4 -231~231-1 long 8 -26 ...

  9. POJ--2570--Fiber Network【floyd+位运算】

    题意:一些公司决定搭建一些光纤网络.单向的,假设从第一点到第二点,有ab两个公司能够搭建,第二点到第三点有ac两个公司能够搭建,第一点到第三点有d公司能够搭建,则第一点到第三点有a.d两个公司能够搭建 ...

随机推荐

  1. Bazinga(HDU5510+KMP)

    t题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题目: 题意:找到一个编号最大的字符串满足:存在一个编号比它小的字符串不是它的字串. 思路:K ...

  2. PAT L2-017. 人以群分

    题目链接:https://www.patest.cn/contests/gplt/L2-017 题目: 社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(out ...

  3. 完全教程 Aircrack-ng破解WEP、WPA-PSK加密利器

    其 实关于无线基础知识的内容还是挺多的,但是由于本书侧重于BT4自身工具使用的讲解,若是再仔细讲述这些外围的知识,这就好比讲述DNS工具时还要把 DNS服务器的类型.工作原理及配置讲述一遍一样,哈哈, ...

  4. 第一章:read/sysread/print/syswrite区别

    use strict; use warnings; #将读入的内容添加到原字符串后面 my $buffer='START:'; , length($buffer)); #my $byts = read ...

  5. linux之cron定时任务介绍

    前言 linux系统有一个专门用来管理定时任务的进程cron,一般是设置成开机自启动的,通过添加任务可以让服务器定时执行某些任务. cron介绍 linux系统有一个专门用来管理定时任务的进程cron ...

  6. python基础===基于requests模块上的协程【trip】

    今天看博客get了一个有趣的模块,叫做 trip     #(pip install  trip) 兼容2.7版本 基于两大依赖包:TRIP: Tornado & Requests In Pa ...

  7. c++ 引用的分析

    在一般教材里面,我们会说引用是变量的别名,另外在 c++ primer 5里面说到引用的时候,说引用不是对象,不能对它进行取地址.但是我们来看看下面代码的分析: #include <iostre ...

  8. android intent 传数据

    1. 基本数据类型 Intent intent = new Intent(); intent.setClass(activity1.this, activity2.class); //描述起点和目标 ...

  9. scrapy框架搭建与第一个实例

    scrapy是python的一个网络爬虫框架,关于它的介绍有很多资料,这里不做过多介绍(好吧我承认我还不是很懂...).我现在还在摸索阶段,因为用scrapy爬取的第一个网站非常简单,不涉及登陆.验证 ...

  10. redis之(十一)redis实现缓存的功能

    [一]redis实现缓存的原理 --->利用键的失效时间设置实现缓存技术 --->由于redis的内存有限,可以在redis的配置文件里设置maxmemory的参数.来限制redis最大可 ...