關於最短路的幾個演算法

2022-05-19 01:23:51 字數 1638 閱讀 1285

關於最短路的幾個演算法有dijkstra,bellman-ford,floyd

dijkstra:

dijkstra適用於邊權為正的情況,從單個源點出發,到其他所有結點的最短路

演算法的核心是用已經知道的結點 i 的距離 d[i] 去更新和這個結點相連的其他結點的距離

struct

node

};struct

dijkstra

void addedge(int

from,int to,int dist) //

如果是無向邊需呼叫兩次addedge

); m=edges.size();

g[from].push_back(m-1

); }

};void dijkstra(int s) //

求s到所有點的距離}}

}

其核心思想還是沒有變,依舊是用已經知道的點去更新起點s到其他點的距離,用優先佇列,優先順序最大的是距離最小的點,然後用這個點去更新其他點

最壞的情況下仍然會迴圈n-1次,但是從整體上看,每條邊恰好被檢查過一次,所以鬆弛操作的執行次數恰好是m次,這樣只用找未被訪問的d的最小值即可

可以說即使是稠密圖,用了priority_queue還是會比用鄰接矩陣的dijstra演算法快,因為不滿足d[e.to]>d[u]+e.dis是不能入隊的,所有push操作會很少

bellman-ford:

bellman-ford也是乙個求最短路的演算法,這個演算法用於算最短路的時候,如果最短路存在,那麼一定是乙個不含環的最短路,那麼這個演算法還有乙個用處就是判環,

如果存在負環的話,那麼便不會存在最短路(因為會不斷鬆弛下去)

如果不含環的話,那麼最多便通過n-1個結點(不包含起點),通過n-1「輪」鬆弛操作便可以計算出最短路

演算法核心就是通過迴圈n-1次,每次對所有的邊進行鬆弛操作邊去更新結點距離

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

d[i]=inf;

d[0]=0

;for(int i=0;i1;i++) //

迭代n-1次

}}

這個**很明顯沒有進行負環的判定,複雜度是o(nm)

可以用fifo佇列進行優化,可以進行迴圈檢查

struct

edge

};vector

edges;

vector

g[maxn];

int vis[maxn]; //

判斷結點是否被訪問

int p[maxn]; //

最短路上的一條弧

int d[maxn]; //

起點s到各點的距離

bool bellman-ford(int

s) }

}return

true

; }

}

用佇列優化的bellman-ford也叫spfa(shortest path faster algorithm)

下面討論下spfa

先**這兩篇,覺得寫的不錯,以後慢慢填坑

幾個常用最短路徑演算法

今天來總結一下常用的最短路徑演算法。符號簡稱 e of edges v of vertexes single source shortest path on non weighted graph bredth first search non negative cylic graph dikstra...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

關於最短路

把最近做的幾道最短路一起總結一下吧 poj1062 中文題,不解釋題意,對於渣渣來說,是先看別人題解後才做的,以酋長的允諾作為目標點,每乙個物品與替換物之間會有一條邊,由於交換有限制,所以建完圖後,以每乙個點為終點或是說最高點,先遍歷一次,把不能交換或間接交換的點去掉,然後再進行最短路尋找。實際就是...