複習之路 最短路演算法Dijsktra

2021-08-28 20:20:59 字數 1947 閱讀 8846

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