一、概況
spfa演算法是常用的最短路演算法之一,複雜度還是非常可觀的。
但缺點在於遇到稠密圖或者某些奇特的圖時可能會變慢。
spfa演算法是一種單元演算法,選擇乙個出發點,計算它與其他點的最短距離。通過更新邊來不斷更新最短路。在圖論的最短路題中應用十分廣泛。
二、過程
1.初始化每個節點到第乙個點的距離
其他點到第乙個點的距離賦個大數(such as 19260817)方便此後進行更新。
dis[1]=0;
2.用佇列實現spfa
首先講第乙個點假如佇列
將與第乙個點相連的點加入佇列
更新與第乙個點相連的點的最短路
將第乙個點移除佇列
再將與此時的隊首元素相連的點加入佇列,用隊首元素更新與它相連的點。(具體實現見**)
以此類推直到隊中元素清空,輸出最短路。
**解釋
dis[i] 第i個點到第1個點的距離。
vis[i] 判斷第i個點是否被訪問過,即是否在佇列中
l,r隊首隊尾模擬指標
q[i]代表佇列元素
#include#include#includeconst int maxn=1e6+7;
const int inf=1e9+7;
using namespace std;
int n,m,s,l,r,from,go,val,size=0,head[maxn],to[maxn],next[maxn],len[maxn],dis[maxn],q[maxn];
bool vis[maxn];
void addedge(int x,int y,int z)
void spfa(int a)
dis[a]=0;
l=0,r=1;
q[r]=a,vis[a]=1;
while(l!=r)
{ l++;
if(l==maxn) l=0;
int x=q[l];
for(int p=head[x];p;p=next[p]){
if(dis[x]+len[p]
洛谷3371 spfa模板題
如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...
最短路(SPFA演算法)模板題 洛谷P3371
spfa演算法是寬搜優化版bellman ford演算法。這是一種基於鬆弛 relax 操作的最短路演算法。支援負權。能找到某個結點出發到所有結點的最短路,或者報告某些最短路不存在。演算法區別於bellman ford的核心思想就是 只有當某個頂點u的d u 發生改變時,它的鄰接點v的d v 才可能...
洛谷 縮點 tarjan演算法模板題
目錄 題目描述 輸入格式 輸出格式 思路 給定乙個 n個點 m 條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。第一行兩個正整數 n,m 第二行 n個整數,依次代表點權 第三至 m 2行,...