最短路(dij 優先佇列優化)模板

2021-09-26 01:54:06 字數 1652 閱讀 3718

有n個城市,求s到e的最短路徑;

當n的值較小時,直接用(dij)演算法沒有問題,但是當數值較大或者訪問過多時就需要優化;

演算法思想:貪心,從起點開始,不斷的尋找不同點到起始點的最短距離;

鏈結一篇部落格:

新增鏈結描述

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const

int n=

1e3;

const

int inff=

0x3f3f3f3f

;int dis[n]

,head[n]

;bool p[n]

;int cnt=0;

struct nodeedge[n*10]

;void

add(

int x,

int y,

int val)

// 建邊;

void

dij(

int n,

int s)

if(dis[m]

==inff)

break

; p[m]

=false;

for(j=head[m]

;j!=-1

;j=edge[j]

.next)}}

intmain()

dij(n,s);if

(dis[e]

>=inff)

// 路不存在;

printf

("-1\n");

else

printf

("%d\n"

,dis[e]);

return0;

}

從上面的**中我們可以看出時間浪費在了查詢剩餘最小的dis上;

所以我麼要做的就是使用優先佇列消去這一浪費;

#inlcude

using

namespace std;

const

int n=

1e5;

const

int inff=

0x3f3f3f3f

;int head[n]

,dis[n]

;int cnt;

bool p[n]

;struct nodemp[n]

;struct nod};

void

add(

int x,

int y,

int val)

intdij

(int n,

int s));

while

(!q.

empty()

));}

}}if(dis[n]

==inff)

return-1

;return dis[n];}

intmain()

printf

("%d\n"

,dij

(n,1))

;}return0;

}

單源最短路模板(dij 優先佇列)

很多人也許學了spfa,覺得簡單方便,然而呢,spfa的複雜度是o 玄學 容易被出題人出資料卡,於是我們要學用優先佇列優化的dij。如果大家理解dij演算法的核心,那麼也會很容易理解為什麼優先佇列可以優化的。沒優化前的dij,我們每次鬆弛都要遍歷1 n 1 to n 1 n,來找到dis i dis...

最短路 dij鏈式向前星優先佇列優化

暑假集訓的休息日到了,本想在學校自習的babilong在ly和sun of ice的蠱惑下,被拉去了my的電影院玩遊戲。my共有n個區域,包括學校,電影院和n 2個其他區域,其他區域中都是休息站,休息站中沒有學校和電影院。並且在my有m條道路,每條道路連線a,b兩個區域且通過此條道路需要付出c的 雙...

HDOJ 2544 最短路(DIJ 優先佇列)

最短路 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運...