不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白。。。还是对状态压缩不是很熟练,理解几个位运算用了好久时间。有些题目自己看着别人的题解做出来完全不是一个味,毕竟别人给你提供了思路,比如这道题,刚看题目,怎么就能转移到是用最短路搜索呢。。其次,好多注意事项这些自己想出来才真正是锻炼思维。否则总是踩着别人的脚印在行走

还有就是不得不说一说UVA上的题目,又长又难懂。。。实在是弄得我好烦。

说说这个题目,能够发现是个隐式图是第一个难点,然后怎么进行搜索就是关键了,状态压缩确实是个好东西,通过二进制来表示当前bug是否被修复,1 为bug,0为已修复,因此,初始状态就是n个1,因为补丁有诸多限制,有的需要某个bug已经被修复了才能运行该补丁,有些需要某些bug还在,每个bug分别用两个变量来分别记录需要哪些bug被修复,以及哪些bug需要存在,此外,补丁可以修补某个bug的同时又可能会产生新的bug,同样用两个变量来记录bug的消失和产生。

用到的pair和优先队列,第一次用,还需要继续熟悉。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
struct node
{
int value;
int bp,bm,tp,tm;
} patch[];
int vis[<<];
bool flag;
typedef pair<int , int> pill;
struct cmp
{
bool operator()(const pill a,const pill b){
return a.first>b.first;
}
}; priority_queue<pill,vector<pill>,cmp> q;
int nbug,npatch,vmin;
void init()
{
flag=;
while (!q.empty())
q.pop();
memset(vis,,sizeof vis);
for (int i=;i<=npatch;i++)
{
patch[i].bp=patch[i].bm=patch[i].tp=patch[i].tm=;
}
}
void dijstla()
{
q.push(make_pair(,(<<nbug)-));
while (!q.empty())
{
pill u=q.top();
q.pop();
//printf("%x\n",u.second);
if (u.second==)
{
flag=;
vmin=u.first;
return;
}
if (vis[u.second]) continue;
vis[u.second]=;
for (int i=;i<npatch;i++)
{
int t=u.second;
if (((t&patch[i].bp)==patch[i].bp) && (((~t)&patch[i].bm)==patch[i].bm))
{
t|=patch[i].tp;
t&=(~patch[i].tm);
}
q.push(make_pair(u.first+patch[i].value,t));
}
}
}
int main()
{
int i,j;
char c1[],c2[];
int cnt=;
while (scanf("%d%d",&nbug,&npatch))
{
if (!nbug && !npatch) break;
init();
for (i=;i<npatch;i++)
{
scanf("%d%s%s",&patch[i].value,c1,c2);
for (j=;j<nbug;j++)
{
if (c1[j]=='+') patch[i].bp=patch[i].bp|(<<j);
if (c1[j]=='-') patch[i].bm=patch[i].bm|(<<j);
if (c2[j]=='+') patch[i].tp=patch[i].tp|(<<j);
if (c2[j]=='-') patch[i].tm=patch[i].tm|(<<j);
}
}
dijstla();
printf("Product %d\n",++cnt);
if (!flag)
{
puts("Bugs cannot be fixed.");
}
else
{
printf("Fastest sequence takes %d seconds.\n",vmin);
}
putchar('\n');
}
return ;
}

UVA 658 状态压缩+隐式图+优先队列dijstla的更多相关文章

  1. 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)

    这道题用到了很多知识点, 是一道好题目.      第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算.     第二这里是隐式 ...

  2. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  3. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  4. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  5. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

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

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

  7. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

  8. UVA 11825 状态压缩DP+子集思想

    很明显的状态压缩思想了.把全集分组,枚举每个集合的子集,看一个子集是否能覆盖所有的点,若能,则f[s]=max(f[s],f[s^s0]+1).即与差集+1比较. 这种枚举集合的思想还是第一次遇到,果 ...

  9. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

随机推荐

  1. 099-PHP二维数组的元素输出二

    <?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 ...

  2. Lombok认知

    Lombok的简介 Lombok是一款Java开发插件,公司项目到处使用,整体效果很棒,代码更干净.Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型 ...

  3. 【OJ2216】小奇的数列

    题目大意 : 给定一个长度为 \(n\) 的数列,以及 \(m\) 次询问,每次给出三个数 \(l\),\(r\) 和 \(P\),询问 \((\sum_{i=l_1}^{r_1}a_i)\;mod\ ...

  4. HTMLCSS学习

    子选择器:第一代 .food>li{border:1px solid red;} 后代选择器:所有后代         .first  span{color:red;} 通用选择器:       ...

  5. PHP数组创建和遍历(基础)

    数组定义PHP数组可以是混合数组 你的数组里面可以有数字也可以有字符串,二维数组不谈一个数组里还有数组跟C有差别定义方式例如 $dd=array(array(1,2,3),array(1,2,3,4) ...

  6. yum 安装 Mysql error ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 开启远程连接 修改登入密码 忘记root密码 配置防火墙规则 随手mark

    yum 安装 MYsql:        yum install mysql mysql-server mysql-devel -y 1.1 登入报错: ERROR 1045 (28000): Acc ...

  7. mysql数据库管理、常用命令及函数(10.10 第十八天)

    数据库管理: MYSQL 轻量级数据库,适用于中小型企业,性能好,开源的(免费的) MSSQL 微软开发的,需要安装在NT系统中,不支持跨平台,适用于中大型企业 ACCESS 小巧方便,适用于小型企业 ...

  8. 关于 python 中 虚拟环 virtualen境的操作

    python3.X安装和pip安装方法 pip install -i https://pypi.douban.com/simple XXX 1.安装virtualenv pip install vir ...

  9. JAVAEE 和项目开发(第四课:HTTP的响应格式和响应状态码)

    HTTP 协议之响应 响应格式的结构: 响应行(状态行):HTTP 版本.状态码.状态消息 响应头:消息报头,客户端使用的附加信息 空行:响应头和响应实体之间的,必须的. 响应实体:正文,服务器返回给 ...

  10. java多线程并发(二)--线程的生命周期及方法详解

    上篇随笔介绍了线程的相关基础知识以及新启线程的几种方法,本片将继续介绍线程的生命周期及方法详解. 一.线程的生命周期 在Thread代码中,线程的状态被分为6种 public enum State { ...