spfa演算法(洛谷模板題)

2021-08-10 13:25:03 字數 1059 閱讀 6730

一、概況 

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行,...