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不存在负权回路,即最短路径一 ... 
随机推荐
- CSS两列布局的多种方式
			两列布局(一侧固定宽度,一侧自适应),在工作中应该是经常使用到,可以说是前端基础了.这种两列布局的样式是我们在平时工作中非常常见的设计,同时也是面试中要求实现的高频题.很有必要掌握以备不时之需.这里总 ... 
- 关于ThreadLocal的那些事
			这篇文章(看完了再看下面的)很好地解释了ThreadLocal是什么,怎么用,是否能解决线程安全问题,非常nice.但个人认为讲解存在遗漏,进行如下示例补充: InheritableThreadLoc ... 
- oracle 相关 sql
- Linux程序开发中如何判断目录是否为根目录?
			问题引入 判断某个目录字符串是否是根目录,咋一听很简单,只要判断字符串是否是"/"即可,但是,很多情况下使用的路径是相对路径,那么如何判断相对路径是根目录呢? 思路分析 熟悉Lin ... 
- 关于mybatisPlus一些坑,当条件为null时
			1.TStaffDepart 属性有值是才匹配条件,会报错,相当于mybatis if 判断 eg:TStaffDepart staffDepart = new TStaffDepart();staf ... 
- Docker 初始
			1. Docker 是什么? 官网的介绍是"Docker is the world's leading software container platform." 官方给Docke ... 
- 在Linux中输入命令时打错并按了enter
			今天在Linux中输入命令时,打错一个单词了,之后出现一串串的~,按ESC也没用, 并在底部出现:quit<enter> to exit vim 解决办法: 按几下 esc 确保 vim ... 
- webug第五关:一个优点小小的特殊的注入
			第五关:一个优点小小的特殊的注入 既然是头部注入,首先想到xff注入 出现数据库报错,而且他是直接将xff后的内容带入数据库查询 
- Camtasia的标记使用方法
			相信大家都想过学习或者尝试过编辑视频,可能曾经也下载使用过微课录制软件Camtasia(win),或许现在也还在使用.小编现在也经常使用Camtasia录屏编辑视频,在编辑的过程中,总是会不小心在轨道 ... 
- iOS沙盒文件目录介绍
			1.APP沙盒目录结构简介 首先奉上苹果官方文档: https://developer.apple.com/library/archive/documentation/FileManagement/C ... 
