SPFA判负环

有不足的地方请指出

本蒟蒻一定会修改吼

【前言】

最短路的求法中最广为人知的我仅仅知道的,有弗洛伊德,dijkstra和SPFA。

弗洛伊德最简单的三重循环,复杂度n^3,一般也就做个n小的题目,遇到n大一点的(超过1000)几乎就只能拿部分分。

SPFA是一种广为人知的已经死掉的算法(某人说过一道图论题如果不卡卡SPFA就不是一道好的图论题目),但是他却有一个很重要的作用,是其他三者无法代替的,那就是这篇博客的题目,判负环!

dijkstra是这三种里面最为稳定的一种算法,何为稳定,弗洛伊德只能跑那么小的数据范围就可以看出来,在很多题目上面只能打一下暴力,SPFA就更不用多说了他死了,所以dijkstra理所当然的成为了最稳定的算法。

说这么多就是为了引出SPFA判负环!

【不可代替性】

dijkstra和弗洛伊德都是判断不了负环的

弗洛伊德可以判断负环

但是我不会

我也不想会

人家SPFA好不容易有一个活着的理由干嘛要给人家扼杀掉

dijkstra遇到负权边就死了

更别说负环了

但是SPFA可以判断负环

具体原因不多赘述了,学过dijkstra和弗洛伊德的应该都知道

但是我不知道

【具体实现】

SPFA的过程

每次都拿一个点到起点的距离来松弛其他的点到起点的距离

判负环

负环是一个边权值和等于负数的环

可以想想一下

如果SPFA遇到了负环会出现什么情况

一直松弛下去

因为每次出现的负数都可以让目前最短的边变得更短

所以可以根据这一点

开一个数组用来记录这是这一条链上第几个入队的数

然后每次松弛的时候都把到达的点入队的数标为前面这个点入队的次数+1,因为这是一个顺序的过程

就像是1,2,3……这样的数列

然后如果出现了负环就会和上面说的一样一直松弛下去

然后这个负环上的点入队的数就会不断变大

可以想一下

如果n个数连成一个点

那入队数最大才只能是n

所以只要某个点的入队数大于了n

那就可以证明他在不停得松弛

也就是出现了负环

【核心代码】

bool SPFA(int acioi)
{
queue<int>q;
for(register int i = 1;i <= n;++ i)
d[i] = 99999999;
d[acioi] = 0;
q.push(acioi);
while(!q.empty())
{
int x = q.front();
q.pop();use[x] = false;
for(register int i = head[x];i != 0;i = a[i].ne)
{
int y = a[i].y;
if(d[y] > d[x] + a[i].z)
{
d[y] = d[x] + a[i].z;
cnt[y] = cnt[x] + 1;
if(cnt[y] > n)
return false;
if(use[y] == false)
{
use[y] = true;
q.push(y);
}
}
}
}
return true;
}

【例题】

洛谷P2136 拉近距离

SPFA判负环板子题

详情解释请看

这里

洛谷P3385 【模板】负环

同样也是板子题

想请解释请看

这里

浅谈SPFA判负环的更多相关文章

  1. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

  2. Poj 3259 Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 42366 Accepted: 15560 传送门 Descr ...

  3. spfa判负环

    bfs版spfa void spfa(){ queue<int> q; ;i<=n;i++) dis[i]=inf; q.push();dis[]=;vis[]=; while(!q ...

  4. poj 1364 King(线性差分约束+超级源点+spfa判负环)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14791   Accepted: 5226 Description ...

  5. 2018.09.24 bzoj1486: [HNOI2009]最小圈(01分数规划+spfa判负环)

    传送门 答案只保留了6位小数WA了两次233. 这就是一个简单的01分数规划. 直接二分答案,根据图中有没有负环存在进行调整. 注意二分边界. 另外dfs版spfa判负环真心快很多. 代码: #inc ...

  6. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

  7. [P1768]天路(分数规划+SPFA判负环)

    题目描述 “那是一条神奇的天路诶~,把第一个神犇送上天堂~”,XDM先生唱着这首“亲切”的歌曲,一道猥琐题目的灵感在脑中出现了. 和C_SUNSHINE大神商量后,这道猥琐的题目终于出现在本次试题上了 ...

  8. LightOj 1221 - Travel Company(spfa判负环)

    1221 - Travel Company PDF (English) Statistics problem=1221" style="color:rgb(79,107,114)& ...

  9. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

随机推荐

  1. elasticsearch配置文件中http.cors.x字段有哪些用途和用法

    http.cors.enabled 是否支持跨域,默认为false http.cors.allow-origin 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使 ...

  2. Oracle学习笔记(四)

    Oracle中的体系结构: oracle体系结构中的进程: 共享池相关的优化: drop table t purge; create table t as select * from dba_obje ...

  3. Spring @Autowired 注入为 null

    原因 配置缺失,比如为开启注解扫描驱动.注入组件为注册: 使用 new 关键字创建的对象不受spring容器管理,无法注入: 注入静态变量, 静态变量/类变量不是对象的属性,而是一个类的属性,spri ...

  4. Linux 6 本地网络配置方法

    在Linux 6 系统安装完成后,需要对网络进行一系列的配置,有些朋友喜欢使用桌面图形化工具的配置方式,这种配置方法虽说比较方便,但是在某些时候并不问题,总是会出现各种问题.特别是作为服务器用途的时候 ...

  5. MongoDB和Java(1):Linux下的MongoDB安装

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  6. Typora基础

    Typora下载网址https://typora.io 一级标题 :# 空格 编写内容 二级标题 2*# 空格 内容 typora快捷键 ctrl+1 =一级标题 有序内容 1.+tab (Q旁边的t ...

  7. MySQL计算相邻两行某列差值的方法

    简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...

  8. js基础闭包练习题

    题目描述 实现函数 makeClosures,调用之后满足如下条件:1.返回一个函数数组 result,长度与 arr 相同2.运行 result 中第 i 个函数,即 result[i](),结果与 ...

  9. appium 设备信息字典(desired_caps)

    操作系统类型.操作系统版本.设备名称.要操作的APP应用的包名.activity名称desired_caps = { "platformName":"Android&qu ...

  10. MySQL Replication--事务组提交和多线程复制

    事务组提交和多线程复制 在MySQL 5.7版本引入基于LOGICAL_CLOCK的多线程复制,依赖于BINLOG事件中的last_committed属性,该last_committed属性是否与事务 ...