Dijkstra求最短路(堆優化版)

2021-10-24 04:55:51 字數 1027 閱讀 8010

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為非負值。

請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出-1。

輸入格式

第一行包含整數n和m。

接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。

輸出格式

輸出乙個整數,表示1號點到n號點的最短距離。

如果路徑不存在,則輸出-1。

資料範圍

1≤n,m≤1.5×105,

圖中涉及邊長均不小於0,且不超過10000。

輸入樣例:

3 31 2 2

2 3 1

1 3 4

輸出樣例:

3思想

for 1~n 每次尋找不在st陣列中距離第1個點最近的點

更新st陣列

用這個最近距離更新其他點到1的距離

時間複雜度

尋找路徑最短的點:o(n)

加入集合s:o(n)

更新距離:o(mlogn)

#includeusing namespace std;

const int n=1e6+10;

int h[n],idx,ne[n],e[n],w[n];//儲存邊相關操作

typedef pairpl;//定義數對 方便後面定義

void add(int a,int b,int c)

int dist[n],s[n],n,m;//dist 第1個點到第i點的最小距離 s 記錄每個點是否被取出 最小值

int disj());//推入第乙個點

while(q.size())

cout<總結

dijkstra演算法求最短路就是不斷尋找最短到起點的距離用這個距離更新其他點到起點的距離。

模版 堆優化Dijkstra求最短路

一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...

Dijkstra求最短路(樸素and堆優化)

題目來自acwing 題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸出格式...

Dijkstra求最短路(樸素做法與堆優化)

dijkstra求最短路的基本思路是貪心演算法,求解單源最短路。適用於求解正權邊。演算法的基本原理可以自行檢視。這裡講解兩種求最短路的方法 1 樸素演算法 樸素演算法的時間複雜度為o n2 適用於稠密圖,用鄰接矩陣來存圖,並且可以處理自環和重邊。dijkstra求最短路 i 給定乙個n個點m條邊的有...