SPFA算法优化
前言
\(SPFA\) 通常在稀疏图中运行效率高于 \(Dijkstra\) ,但是也容易被卡。
普通的 \(SPFA\) 时间复杂度为 \(O(km)\) ,其中 \(k\) 是一条边松弛其端点点的次数,是一个较小的常数。
但是对于特殊构造的图中也会退化到 \(O(nm)\) ,这就与 \(Bellman-Ford\) 一样。
对此部分情况,可使用 \(SLF\) 与 \(LLL\) 优化 \(SPFA\) 。
C++代码
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
void Quick_Read(int &N) {
N = 0;
int op = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-')
op = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
N = (N << 1) + (N << 3) + (c ^ 48);
c = getchar();
}
N *= op;
}
const int MAXN = 1e6 + 5;
struct Node {
int to, dist;
Node() {}
Node(int T, int D) {
to = T;
dist = D;
}
};
vector<Node> v[MAXN];
deque<int> q;
int dis[MAXN];
bool inque[MAXN];
int n, m, s;
void Write() {
for(int i = 1; i <= n; i++)
if(dis[i] != INF)
printf("%d ", dis[i]);
else
printf("2147483647 ");
}
void SPFA() {
int iqn = 1, fis = 0;
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
memset(inque, 0, sizeof(inque));
inque[s] = true;
q.push_back(s);
while(!q.empty()) {
int now = q.front(); q.pop_front();
inque[now] = false;
fis -= dis[now];
iqn--;
int SIZ= v[now].size();
for(int i = 0; i < SIZ; i++) {
int next = v[now][i].to;
if(dis[next] > dis[now] + v[now][i].dist) {
dis[next] = dis[now] + v[now][i].dist;
if(!inque[next]) {
inque[next] = true;
if(q.empty() || dis[next] > dis[q.front()] || dis[next] * iqn <= fis)
q.push_back(next);
else
q.push_front(next);
fis += dis[dis[next] + v[now][i].dist];
iqn++;
}
}
}
}
}
void Read() {
int A, B, C;
Quick_Read(n);
Quick_Read(m);
Quick_Read(s);
for(int i = 1; i <= m; i++) {
Quick_Read(A);
Quick_Read(B);
Quick_Read(C);
v[A].push_back(Node(B, C));
}
}
int main() {
Read();
SPFA();
Write();
return 0;
}
但上述优化也有缺陷,并不适用与所有图。
\(LLL\) 优化常见卡掉的方法很简单,向 \(1\) 连接一条权值巨大的边,这样 \(LLL\) 也无能为力,之前做的松弛等于白费。
\(SLF\) 使用链套菊花,可以轻松卡掉。
若全部边权正负性相同,还是使用 \(Dijkstra\) 算法,其稳定性是 \(SPFA\) 不具有的。
SPFA算法优化的更多相关文章
- 【最短路径】 SPFA算法优化
首先先明确一个问题,SPFA是什么?(不会看什么看,一边学去,传送门),SPFA是bellman-ford的队列优化版本,只有在国内才流行SPFA这个名字,大多数人就只知道SPFA就是一个顶尖的高效算 ...
- 【最短路径】 SPFA算法
上一期介绍到了SPFA算法,只是一笔带过,这一期让我们详细的介绍一下SPFA. 1 SPFA原理介绍 SPFA算法和dijkstra算法特别像,总感觉自己讲的不行,同学说我的博客很辣鸡,推荐一个视频讲 ...
- SPFA算法 - Bellman-ford算法的进一步优化
2017-07-27 22:18:11 writer:pprp SPFA算法实质与Bellman-Ford算法的实质一样,每次都要去更新最短路径的估计值. 优化:只有那些在前一遍松弛中改变了距离点的 ...
- 关于SPFA算法的优化方式
关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予 ...
- SPFA算法(SLF优化)2022.7.8更新
SPFA可能会被卡掉,能用dijkstra就别用SPFA,代码较长,但我已尽力做到解释,请耐心看下去,存储为邻接表存储. #include<bits/stdc++.h> #define i ...
- 最短路径问题的Dijkstra和SPFA算法总结
Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...
- SPFA算法
SPFA算法 一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法 ...
- SPFA算法学习笔记
一.理论准备 为了学习网络流,先水一道spfa. SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在 ...
- 最短路径--SPFA 算法
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...
随机推荐
- lseek系统调用
文件的随机读写.目前为止,文件都是顺序访问.读写都是从当前文件的偏移位置开始,然后文件偏移值自动的增加到刚好超出读或者写结束的位置是它为下一次作好准备.在linux中有文件偏移.使得随机访问变得简单, ...
- nginx状态监控统计
nginx是一款很优秀的web服务器软件,很多地方都有接触和使用到他,大部分的场景压力还没达到需要调优的地步,而调优的难点其实不在于调,而在于各项状态的监控,能够很快的找到资源在什么时候出现问题,调整 ...
- 多线程实现socketserver练习
1.server import socket from threading import Thread def my_socketserver(conn, addr): conn.send(b'hel ...
- Android10_原理机制系列_AMS之AMS的启动
概述 该篇基于AndroidQ,主要介绍系统启动中的 AMS(ActivityManagerService)的启动过程. AMS对四大组件(AndroidQ将activity移到了ActivityTa ...
- DDD(领域驱动设计)--战略设计
领域 领域是一个组织所做的事情以及其中所包含的一切.商业机构通常会确定一个市场,然后在这个市场中销售产品和服务.每个组织都有它自己的业务范围和做事方式. 领域就是解决一个特定范围内的业务问题. 如何分 ...
- apiAutoTest-更新2020/11/23
原始版本 简书:https://www.jianshu.com/p/6bfaca87a93b 博客园:https://www.cnblogs.com/zy7y/p/13426816.html test ...
- Java 中常见的细粒度锁实现
上篇文章大致说了下 ReentrantLock 类的使用,对 ReentrantLock 类有了初步的认识之后让我们一起来看下基于 ReentrantLock 的几种细粒度锁实现. 这里我们还是接着用 ...
- java~通过springloaded实现热部署
之前写过使用自定义的classLoader进行动态加载,热部署:它有很多弊端,我总结一下: 当前项目不能引用第三方包 当前项目必须使用反射的方式调用第三方包的方法 写死的一些路径 springload ...
- MindManager主题标记功能怎么使用
我们在使用MindManager制作思维导图的过程中,经常需要对主题的类别,优先程度等进行整理,毫无疑问,这是一项繁琐却又不得不做的工作.今天小编为大家带来了MindManager主题整理的一些小技巧 ...
- 攻克solo第五课(Mixolydian 音阶)
相对于独奏来说,我们已经说过了很多关于solo或独奏的乐理和技巧.那么这篇文章,笔者将使用guitar pro7软件来跟大家分享Mixolydian 音阶的演奏技巧,以及如何在学习Mixolydian ...