有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。但是每當我們的工作人員把上百件的衣服從商店運...