Bellman Ford和SPFA演算法

2021-08-21 05:09:52 字數 927 閱讀 9996

定義

給定一張有向圖,若對於某一條邊(x,y,z),有dist[y]<=dist[x]+z成立,則稱該邊滿足三角形不等式。若所有邊均滿足三角形不等式,則dist陣列就是所求的最短路。

基於迭代思想的bellman-ford演算法

1.掃瞄所有邊(x,y,z),若有dist[y]>dist[x]+z,則更新dist[y]

2.重複上述步驟直到沒有更新操作發生

spfa演算法(佇列優化的bellman-ford演算法)

1.建立乙個佇列,最初只含有起點1

2.取出隊頭節點掃瞄所有出邊(x,y,z),若有dist[y]>dist[x]+z,則更新dist[y]

同時,若y不在佇列中則把y入隊  //避免了對不需要拓展的節點的冗餘掃瞄

3.重複上述步驟直到隊列為空

tips

1.乙個節點可能會入隊、出隊多次

2.spfa適用於稀疏圖,為o(km)級別,k是乙個較小的常數

但在稠密圖或特殊構造的網格圖上可能退化為o(nm)

**實現//by ziwan catherine

//spfa 邊權可以為負

//d[n]從起點到n的最短路

#include#include#include#include#includeusing namespace std;

const int n=10010,m=1000010;

int head[n],ver[m],edge[m],next[m],d[n];

bool v[n];

int n,m,tot;

queueq;

void spfa()

} }}int main()

//構建鄰接矩陣

spfa();

for(int i=1;i<=n;i++)

cout《判定負環

LSDB和SPF演算法

1.鏈路狀態資料庫 lsdb 除了洪氾擴散lsa,發現鄰居外,鏈路狀態協議的第三個任務就是建立鏈路狀態資料庫。鏈路狀態資料庫把接收的lsa作為一串記錄儲存下來。雖然lsa中包括年齡 序列號和其他資訊,但這些資訊都是用於管理lsa洪氾擴散程序。對於最短路徑的決策程序來說,通告路由器id,連線網路和鄰居...

Bellman Ford演算法和Dijkstra演算法

bellman ford演算法是通過relax邊來實現的,由於最短無負權迴路的路徑應該最多有v 1條邊,所以一共執行v 1次relax操作即可,而且注意,每次relax操作都只是基於上一次relax操作之後的圖,和這次relax中已經relax了的節點毫無關係 這個是重點!檢查負權迴路原理 若有負權...

SPF演算法介紹

當鏈路狀態路由演算法構建完lsdb後,接下來節要呼叫spf演算法,對lsdb內的lsa進行處理,計算出所有路徑。spf演算法在 routing tcp ip volmun i 的ospf章節中有描述。spf演算法簡單描述如下 lsdb已收斂 一 選定根節點 二 遍歷該選定節點的所有直連節點。遍歷過程...