求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。 SPFA算法是西南交通大学段凡丁于1994年发表的.松弛操作必定只会发生在最短路径前导节点松弛成功过的节点上,用一个队列记录松弛过的节点,可以避免了冗余计算。复杂度可以降低到O(kE),k是个比较小的系数(并且在绝大多数的图中,k<=2,然而在一些精心构造的图中可能会上升到很高)
struct Edge {
int to;
int cost;
Edge(int to, int cost) :to(to), cost(cost) {}
};
vector <Edge> G[MAXN];
int visited[MAXN];
int dis[MAXN], path[MAXN];
int n, s, t;
void spfa() {
queue<int>que;
int u;
for (int i = 1; i <= n; i++) {
dis[i] = INF;
path[i] = s;
visited[i] = 0;
}
dis[s] = 0;
visited[s]++;
que.push(s);
while (!que.empty()) {
u = que.front(); que.pop(); visited[u]--;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].to;
if (dis[v] > dis[u] + G[u][i].cost) {
dis[v] = dis[u] + G[u][i].cost;
path[v] = u;
if (!visited[v]) {
que.push(v);
visited[v]++;
}
}
}
}
}