「学习笔记」SPFA

$SPFA$ 是 $Bellman-ford$ 的队列优化,但复杂度并不稳定。

$SPFA$ 可以处理负边权,这是 $Dijkstra$ 算法做不到的。

大致步骤:

  • 建立一个队列,初始时队列里只有起始。

  • 再建立一个表格记录起始点到所有点的最短路径(该表格的初始值要赋为极大值,该点到他本身的路径赋为 $0$)。

  • 然后执行松弛操作,用队列里有的点去刷新起始点到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空。

Code

void SPFA() 
{
	for (int i = 1; i <= n; i++) 
	{
		dis[i] = inf;
	}
	dis[s] = 0
	vis[s] = 1;
	queue <int> q;
	q.push(s);
	while (q.size()) {
		int u = q.front();
		q.pop();
		vis[u] = 0;
		for (int i = head[u]; i; i = e[i].nxt)
		{
			int v = e[i].to, w = e[i].w;
			if (dis[v] > dis[u] + w)
			{
				dis[v] = dis[u] + w;
				if (!vis[v]) 
				{
					vis[v] = 1;
					q.push(v);
				}
			}
		}
	} 
}
posted @ 2025-07-25 09:08  Aelt  阅读(12)  评论(0)    收藏  举报