SPFA (Shortest Path Faster Algorithm) 是 Bellman-Ford 的隊列優化版。僅將「被鬆弛」的節點入隊,避免無效掃描。適用於含負權邊、無負環的單源最短路。
dist[s]=0,其餘 INF;源點入隊,標記 inQueuedist[u]+w < dist[v] 鬆弛const int MAXN = 10005, MAXM = 500005;
int head[MAXN], to[MAXM], wgt[MAXM], nxt[MAXM], ecnt;
int dist[MAXN], cnt[MAXN]; bool inq[MAXN];
void addEdge(int u,int v,int w){
to[ecnt]=v; wgt[ecnt]=w; nxt[ecnt]=head[u]; head[u]=ecnt++;
}
bool spfa(int s, int n){
fill(dist, dist+n+1, INF);
memset(cnt,0,sizeof(cnt)); memset(inq,0,sizeof(inq));
queue q; q.push(s); dist[s]=0; inq[s]=true; cnt[s]=1;
while(!q.empty()){
int u=q.front(); q.pop(); inq[u]=false;
for(int e=head[u]; ~e; e=nxt[e]){
int v=to[e];
if(dist[u]+wgt[e] < dist[v]){
dist[v]=dist[u]+wgt[e];
if(!inq[v]){
inq[v]=true;
if(++cnt[v] > n) return false; // 負環
q.push(v);
}
}
}
}
return true;
}
cnt[v] 必須在入隊時 ++,出隊不 --cnt[v] > N 而非 >= N詳細證明與 DFS 版實現可參考:SPFA 算法深度解析