SFPA(Algorithm for Shortest Path According to Flowing Priority)是一种单源最短路算法,它可以在边权有负值的情况下,找到从源节点到其他节点的最短路径。
SFPA算法的核心思想是根据节点的流动优先级来选择拓展的顺序,具体流程如下:
-
初始化:创建一个优先队列和一个标记数组,用来存储每个节点的最短距离和是否已经找到最短路径。
-
将源节点加入优先队列,并标记为已访问,设置源节点的最短距离为0。
-
重复以下步骤直到优先队列为空: a. 从优先队列中取出流动最大优先级的节点u。 b. 遍历节点u的所有邻居节点v,更新v的最短距离:
- 如果从u到v的路径长度加上边(u,v)的权值小于v的最短距离,则更新v的最短距离,并将v加入优先队列。 c. 标记节点u为已访问。
-
完成之后,最短路径的结果可以从标记数组中获得。
下面是一个使用C++实现的SFPA算法的示例代码:
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef pair<int, int> pii;
const int MAXN = 100005;
const int INF = INT_MAX;
vector<pii> graph[MAXN];
int dist[MAXN];
bool visited[MAXN];
void sfpa(int source) {
priority