首页 > 编程语言 >「学习笔记」SPFA 算法的优化

「学习笔记」SPFA 算法的优化

时间:2023-05-01 10:22:37浏览次数:50  
标签:算法 int SPFA 笔记 vis second spfa push dis

与其说是 SPFA 算法的优化,倒不如说是 Bellman-Ford 算法的优化。

栈优化

将原本的 bfs 改为 dfs,在寻找负环时可能有着更高效的效率,但是最坏复杂度为指数级别。

void dfs_spfa(int u) {
	if (fg)    return;
	vis[u] = true;
	for(pil it : son[u]) {
		int v = it.first;
		ll w = it.second;
		if (dis[v] > dis[u] + w) {
			dis[v] = dis[u] + w;
			if (vis[v] == true) {//如果这个点被访问过,就说明这是负环 
				fg = true;//打标记 
				return;
			}
			else    dfs_spfa(v);
		}
	}
	vis[u] = false;
}

SLF 优化

queue 换成 deque,判断与队首元素的 dis 的大小,小的就放队首,大的就放队尾。

void spfa(int s) {
	for(int i = 1; i <= n; ++ i) {
		dis[i] = inf;
	}
	dis[s] = 0;
	q.push_back(s);
	f[s] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop_front();
		f[u] = 0;
		for (pii it : son[u]) {
			int v = it.first;
			int w = it.second;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				if (! f[v]) {
					if (! q.empty() && dis[v] < dis[q.front()]) {
						q.push_front(v);
					}
					else    q.push_back(v);
					f[v] = 1;
				}
			}
		}
	}
}

D´Esopo-Pape 优化

queue 换成 deque,判断一个点是否入过队列,没入过就放到队尾,如果就放到队首。

void spfa(int s) {
	for(int i = 1; i <= n; ++ i) {
		dis[i] = inf;
	}
	dis[s] = 0;
	q.push_back(s);
	f[s] = 1;
	vis[s] = 1; // 是否入过队
	while (!q.empty()) {
		int u = q.front();
		q.pop_front();
		f[u] = 0;
		for (pii it : son[u]) {
			int v = it.first;
			int w = it.second;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				if (! f[v]) {
					if (vis[v]) {
						q.push_front(v);
					}
					else {
						q.push_back(v);
						vis[v] = 1;
					}
					f[v] = 1;
				}
			}
		}
	}
}

LLL 优化

queue 换成 deque,每次将入队结点距离和队内距离平均值比较,如果更大则插入至队尾,否则插入队首。

void spfa() {
	ll sum = 0;
	for (int i = 1; i <= n; ++ i) {
		dis[i] = inf;
	}
	dis[s] = 0;
	q.push_back(s);
	g[s] = 1;
	sum += dis[s];
	while (!q.empty()) {
		int u = q.front();
		q.pop_front();
		vis[u] = false;
		sum -= dis[s];
		for (pli it : son[u]) {
			if (dis[it.second] > dis[u] + it.first) {
				dis[it.second] = dis[u] + it.first;
				if (! vis[it.second]) {
					if (q.empty() || dis[it.second] > sum / ((int)q.size())) {
						q.push_back(it.second);
					}
					else {
						q.push_front(it.second);
						g[it.second] = 1;
					}
					vis[it.second] = true;
				}
			}
		}
	}
}

标签:算法,int,SPFA,笔记,vis,second,spfa,push,dis
From: https://www.cnblogs.com/yifan0305/p/17366120.html

相关文章

  • 线索化二叉树的递归算法
    //线索化二叉树的递归算法#include<stdio.h>#include<malloc.h>typedefstructBiTNode{intdata;structBiTNode*lchild,*rchild;//存储二叉树的左孩子和右孩子}BiTNode,*BiTree;typedefstructThreadNode{intdata;structThreadNode*......
  • m分别使用meanshift和camshift两种算法实现人员跟踪并输出人员移动曲线matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点,它的周围有很多个点 我们计算点 移动到每个点 所需要的偏移量之和,求平均,就得到......
  • pwn刷题笔记(格式化字符串)
    攻防世界:CGfsbchecksec查看保护机制,开启了NX和Canary,32位ELF。反汇编代码如下:intmain(){charbuf[0x7E-0x76];ebp-7Eshortintanonymous_0;ebp-76chars[0x74-0x10];ebp-74intanonymous_1;ebp-10anonymous_1=gs:14h//g......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))={f(n,m):存在正常量c、和,使得对所有n>=n0或m>=m0,有0<=f(n,m)<=cg(n,m)}对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文......
  • 四月读书笔记3
    四月读书笔记3流程图是被吹捧得最过分的一种程序文档。事实上,很多程序甚至不需要流程图,很少有程序需要一页纸以上的流程图。”“现实中,流程图被鼓吹的程度远大于它们的实际作用。没有一个有经验的编程人员,在开始编写程序之前,会例行公事地绘制详尽的流程图。在一些要求流程图的组......
  • 构建之法阅读笔记3
    服务化架构:随着系统复杂度的提高,单体应用已经无法满足业务需求,因此需要将系统拆分成多个小的、自治的服务,以提高系统的可扩展性和灵活性。去中心化思想:在设计系统时,应该避免单点故障,采用去中心化的思想,将负载分散到多个服务器上。同时,要考虑数据的一致性和复制策略。弹性设计:系统......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))=对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文心一言:chatgpt:类比于单个参数的情形,我们可以定义类似的记号:O(g(n,......
  • 人月神话阅读笔记3
    第十三章涉及软件开发中普遍性的问题。尽管每个软件项目都有其独特之处,但是软件开发中也存在许多普遍性的问题,如进度管理和技术选型等。作者提出了一些建议,如制定标准的进度计划和技术选型标准等,用以避免类似的问题在未来出现,并使软件开发工作变得更加高效、可靠和可预测。第十四......
  • 「学习笔记」Floyd 的应用
    求最短路for(intk=1;k<=n;++k){ for(inti=1;i<=n;++i){ for(intj=1;j<=n;++j){ f[i][j]=min(f[i][j],f[i][k]+f[k][j]); } }}求最小环过程记原图中\(u,v\)之间边的边权为\(val\left(u,v\right)\)。我们注意到Floyd算法......
  • 【通信仿真】基于matlab模拟自相干算法仿真
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......