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

2022-05-22 21:33:11 字數 2494 閱讀 6022

dijkstra求最短路的基本思路是貪心演算法,求解單源最短路。

適用於求解正權邊。

演算法的基本原理可以自行檢視。

這裡講解兩種求最短路的方法:

(1)、樸素演算法

樸素演算法的時間複雜度為o(n2),適用於稠密圖,用鄰接表來存圖,並且可以處理自環和重邊。

dijkstra求最短路 i

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

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

輸入格式

第一行包含整數n和m。

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

輸出格式

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

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

資料範圍1≤

n≤500'>1≤n≤500     

1≤n≤500,1≤

m≤105

'>1≤m≤105

1≤m≤105,

圖中涉及邊長均不超過10000。

輸入樣例:

3 3

1 2 2

2 3 1

1 3 4

輸出樣例:
3

模板**:

#include#include

#include

using

namespace

std;

const

int n=510

;int

n,m;

intq[n][n];

intd[n];

bool

f[n];

intdj()

if(d[n]==0x3f3f3f3f) return -1

;

return

d[n];

}int

main()

int k=dj();

printf(

"%d\n

",k);

return0;

}

(2)、堆優化演算法

dijkstra樸素演算法只能處理變數較小的情況,當邊數較多時間複雜度會變得特別大,鄰接表所需空間也會很大。

這裡就可以用到堆優化,堆優化主要適用於稀疏圖(稠密圖用也沒問題),也可以處理自環和重邊。

堆優化主要是用優先佇列來實現,用鄰接表存圖(鄰接表可以自己寫或者直接用vector),時間複雜度為o(m log n )。

模板題:

dijkstra求最短路 ii

給定乙個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

'>1≤n,m≤1.5×105

1≤n,m≤1.5×105,

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

輸入樣例:

3 3

1 2 2

2 3 1

1 3 4

輸出樣例:
3
**:

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1e5+10

;typedef pair

pii;

vector

v[n];

intd[n];

intn,m;

intdij()

);

while(!q.empty()));}

}}

if(d[n]==0x3f3f3f3f) return -1

;

return

d[n];

}int

main()

); }

int k=dij();

printf(

"%d\n

",k);

return0;

}

這裡用pair來存1到id距離和id,優先佇列預設以pair first從小到大排序。

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

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

Dijkstra演算法求最短路 樸素版

圖論中求最短路的演算法有很多,這裡使用一道模板題來介紹可以求單源最短路的dijkstra演算法 acwing 849.dijkstra求最短路 i 求乙個源點到 除了這個點之外其他所有的點 的最短距離,不需要記錄每條路徑 這題一直困惑著我的是,為什麼一開始找的最小的最短距離就是確定的最短距離?想了好...

Dijkstra求最短路 I(樸素演算法)

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