dijkstra
spfa
floyd
dijkstra演算法是一種單源最短路演算法,適用於無負權的圖。其採用了bfs+貪心的方式來更新最短路。
初始化dis[每乙個點]= ∞,dis[起點]=0。
標記起點,加入集合s。其他點不標記,加入集合u。
從集合u中選取與當前點a距離最近的點b。
若起點到點a的距離+點a到點b的距離小於dis中存貯的值,則執行語句4,否則若起點到點a的距離+點a到點b的距離小於dis中存貯的值,則更新dis和當前點。
若所有的點都已經被標記過,則演算法結束,否則,重複執行語句3。
ps :由於時間原因,不在此加圖,以後我會更新乙個gif來更好得描述次過程。
小根堆(優先佇列) o( (n+m)logn )
斐波那契堆 o( m+nlogn )
ps:以下**以洛谷 p3371 【模板】單源最短路徑(弱化版)為例
#include
#define maxn 10005
#define inf 2147483647
using namespace std;
int n,m,s,minn,s,cnt;
int dis[maxn]
,head[maxn]
;bool vis[maxn]
;struct edge
h[500005];
void
add(
int u,
int v,
int w)
inline
void
dij()}
if(t==-1
)break
; vis[t]=1
;for
(int j=head[t]
;j;j=h[j]
.next)}}
intmain()
dij();
for(
int i=
1;i<=n;i++
)printf
("%d"
,dis[i]);
return0;
}
在上述**中,我們用列舉的方式來找到與當前節點相連的非**邊的邊的最小值,這裡顯然是十分浪費時間的,作為追求時間效率oiers,我們對這裡用堆來優化。
一般而言,oiers還會追求**的簡潔,所以,我們用stl中的priority_queue來模擬堆。
ps:以下**以洛谷 p3371 【模板】單源最短路徑(標準版)為例
#include
#define inf 1e9f
#define ll long long
#define maxn 200100
using
namespace std;
struct node};
priority_queue q;
vector< pair
>a[maxn]
;ll n,m,s,dis[maxn]
;bool vis[maxn]
;int
main()
for(
int i=
1;i<=n;i++
)dis[i]
=inf;
dis[s]=0
; q.
push
((node));
while
(!q.
empty()
));}
}}for(
int i=
1;i<=n;i++
)printf
("%lld "
,dis[i]);
return0;
}
為什麼dijkstra演算法不適用邊長為負數的情況
spfa的slf 和 lll優化演算法
就不更╭(╯^╰)╮
對於dijkstra最短路演算法的複習
好久沒有看圖論了,就從最短路演算法開始了。dijkstra演算法的本質是貪心。只適用於不含負權的圖中。因為出現負權的話,貪心會出錯。一般來說,我們用堆 優先佇列 來優化,將它o n2 的複雜度優化為o m n logn 模板鏈結 套用dijkstra模板即可。給出範例 include include...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...
基礎演算法複習之六 最短路徑演算法
記錄兩種最短路徑演算法,一種是迪傑斯特拉演算法,一種是弗洛伊德演算法 最短路徑是指兩個頂點之間經過的邊上權值之和最少的路徑,並且我們稱路徑上的第乙個頂點是源點,最後乙個頂點是終點 1.迪傑斯特拉演算法 djikstra 時間複雜度為o n 2 include include include incl...