首页 > 其他分享 >AcWing852 -- bug

AcWing852 -- bug

时间:2023-03-04 20:36:55浏览次数:47  
标签:... 队列 -- tt int hh bug AcWing852

1. 题目描述

spfa判断负环



2. bug原因

因为是个模板题,所以我做的比较轻松,就用数组模拟队列,但因为 spfa 入队出队十分频繁,因此需要用循环队列,我是这么模拟循环队列的:

int q[N];
int hh = 0, tt = 0;
while(hh != tt)	// not empty
{
    int t = q[hh];	// out queue
    hh = (hh + 1) %N;
    ...
    int j;
    ...
    tt = (tt + 1) % N;
    q[tt] = j;
}

可以发现,我只是在模拟普通队列的基础上加上了取模操作,看起来没什么问题,其实问题大大的!因为这么写无法判断队列什么时候为空!具体的我就不详细说了!



3. 解释

普通队列

int q[N];
int hh = 0, tt = -1;
while(hh <= tt) // not empty
{
    int t = q[ hh ++ ];	// out queue
    ...
    int j;
    ...
    q[ ++ tt ] = j;	// 入队
}

注意,这种将 hh=0;tt=-1; 形式的队列,无法设计为循环队列,因为我们无法判断队空。

在初始时,hh>tt,对空,但因为循环队列的缘故,tt 可能跑到 hh 的前面。

有错误的循环队列

int q[N];
int hh = 0, tt = 0;
while(hh != tt)	// not empty
{
    int t = q[hh];	// out queue
    hh = (hh + 1) %N;
    ...
    int j;
    ...
    tt = (tt + 1) % N;
    q[tt] = j;
}

在这种写法下,初始状态下,hh==tt,队列为空,当 tt 跑到 hh 前面时,判断条件仍然如此。

但是这种情况有一个bug,就是当队满的时候,也是 hh==tt

但是在竞赛中,我们一般将数组开的比较大,因此一般不会出现队满的情况。

不过我们要了解,如果处理该问题。

常见的解决办法是安插一个空位置,用来处理队空和队满的情况。

在安插一个空位置后,队空:hh==tt;

队满:(tt + 1) % N = hh;

Length: (tt - hh + N) % N; (因为 tt - hh 可能为负数,因此需 + N)

N 是队列的大小(包含空位置)

正宗循环队列(带一个空位置)

// N = q.capacity()
int q[N];
int hh = 0, tt = 0;
bool isEmpty()
{
    return hh == tt;
}
bool isFull()
{
    return (tt + 1) % N == hh;
}
size_t length()
{
    return (tt - hh + N) % N;
}
void push(int val)
{
    assert(isEmpty());
    q[tt ++ ] = val;
    tt %= N;
}
void pop()
{
    assert(!isEmpty());
    q[hh ++ ];
    hh %= N;
}

标签:...,队列,--,tt,int,hh,bug,AcWing852
From: https://www.cnblogs.com/ALaterStart/p/17179008.html

相关文章

  • Java Swing项目使用Idea UI Designer设计插件无法启动问题解决方案
    起因最近整理一下以前写的swing项目,结果发现跑不起来了,具体表现为与视图表绑定的Java类的各属性为NULL(插件没有初始化绑定的类对象),导致项目无法启动。(报空指针异常)问题排......
  • Codeforces Round 855 (Div
    Problem-E2-UnforgivableCurse(hardversion)给定一个初始字符串s和目标字符串t,我们可以对字符串s进行以下任意次操作:对于位置\(i\),如果\(i+k+1<=s.length()\)......
  • Docker配置代理
    DockerPull配置代理用docker拉取halohub/halo的时候特别慢,使用国内docker镜像也不行,可以通过设置代理来解决在执行dockerpull时,是由守护进程dockerd来执行。因此,代理需......
  • 单调栈
    一但要求下一个更大的元素,就是用单调栈解,力扣题库相似的题目都是这个解法。栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。单调......
  • lua脚本在redis中的使用
    先开启redis的日志输出修改redis.conf文件,设置logfile/root/tools/redis-6.0.9/logs/redis.log重启redissystemctlrestartredisd创建一个简单的lua脚本test.......
  • lua脚本的使用
    先开启redis的日志输出修改redis.conf文件,设置logfile/root/tools/redis-6.0.9/logs/redis.log重启redissystemctlrestartredisd创建一个简单的lua脚本test.......
  • K线数据导入到飞狐交易师
    在飞狐交易师里建立一个新的市场,可以直接导入K线数据,方便查看外汇比特币等历史K线走势。打开管理-市场管理-新增 怎么填这些内容可以参考已有的市场,比如选择上海证交所......
  • java8新特性-Stream基础
    Stream是跟随Lambda表达式一起发布的java8新特性。是支持串行和并行处理数据的工具。有四种类型的Stream。在StreamShape枚举中定义了Stream的类型。分别是REFERENCE(引用流......
  • ES6-ES11 迭代器介绍
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><tit......
  • Vue快速入门01
    Vue快速入门01一、安装Vue工具(Vuecli)Vuecli基于Vue.js进行快速开发的完整系统。人话:脚手架,顾名思义就是搭建工程的一个工具,脚手架有很多,vue-cli是其中一种。用来帮......