「学习笔记」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);
}
}
}
}
}

浙公网安备 33010602011771号