定義
給定一張有向圖,若對於某一條邊(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已收斂 一 選定根節點 二 遍歷該選定節點的所有直連節點。遍歷過程...