最短路總結1 最短路問題概述與樸素dijkstra

2021-10-05 09:05:54 字數 2759 閱讀 8018

最短路系列鏈結

最短路總結1 最短路問題概述與樸素dijkstra

最短路總結2 堆優化dijkstra

最短路總結3 bellmanford

最短路總結4 spfa及應用

最短路總結5 floyd

1.最短路問題概述

若網路中的每條邊都有乙個數值(長度、成本、時間等),則找出兩節點(通常是源節點和阱節點)之間總權和最小的路徑就是最短路問題。

最短路問題,其實就是給定乙個網路,給定乙個或一組起點(術語叫源點),對這些源點給定其他點,詢問這些點到源點的最短路徑。

2. 分類

單源是指單一起點到其他點的最短路,多源是指求每組起點到終點的最短路。

堆優化dijkstra是在樸素版基礎上,利用小根堆的自動維持順序的特性優化樸素版中的某一步。

spfa演算法一般不論稠密圖還是稀疏圖,都用鄰接矩陣儲存圖。

spfa演算法本質上是利用寬搜的思想對 bellerman-ford演算法做的優化,因此spfa很強大,在絕大多數情況下可以用spfa演算法代替bellman-ford演算法解決問題,因此重點掌握。(其實也可以代替dijkstra)

spfa演算法的侷限:當圖**現一下兩點之一時spfa演算法失效,只能使用bellman-ford演算法。

(1)限制最短路的路徑經過不超過k條邊

(2)圖中存在負權迴路(回路邊權之和為負數)

spfa演算法可以用來判斷是否存在負環,另:判斷正環用tanjar演算法

3.樸素dijkstra演算法(on^2+m)

初始化各點到源點的距離

迭代n-1次(除源點外有n-1個點)

(1)在最短路未確定的點中,找距離源點最近的點v。(用bool陣列標識該點的最短路是否已經確定)

(2)用v點去更新全圖所有點的當前最短路距離(dist)

(3)若i點滿足:dist[i] > dist[v] + w[v][i]則更新i點的dist值

更新全圖後將該點設定為最短路已經確定

這裡假設找到的v點是2點,用2點去更新全圖,實際上這裡就是更新3點,也就相當於判斷這兩條到路徑誰更短:(1)1->2->3距離為dist[2]+w[2][3](2)1->3距離為dist[3]。推廣到更大更複雜的網路中,也是乙個個類似這樣去比較更新,比較完所有點,則v點不可能再被更新,所以設定v點的最短路已經確定。

4.模板

int g[n]

[n];

// 儲存每條邊

int dist[n]

;// 儲存1號點到每個點的最短距離

bool st[n]

;// 儲存每個點的最短路是否已經確定

// 求1號點到n號點的最短路,如果不存在則返回-1

intdijkstra()

if(dist[n]

==0x3f3f3f3f

)return-1

;return dist[n]

;}

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

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

輸入格式

第一行包含整數n和m。

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

輸出格式

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

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

資料範圍

1≤n≤5001≤n≤500,

1≤m≤1051≤m≤105,

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

輸入樣例:

3 31 2 2

2 3 1

1 3 4

輸出樣例:

3

#include

#include

#include

#include

using

namespace std;

const

int n=

550,inf=

0x3f3f3f3f

;int n,m;

int g[n]

[n];

int dist[n]

;bool st[n]

;int

dijkstra()

st[t]=1

;}if(dist[n]

>=

1000000000

)return-1

;else

return dist[n];}

intmain()

}int t=

dijkstra()

; cout<

return0;

}

6.小細節

去重邊:在儲存圖時,取兩點之間多條邊的最短的那條

去自環:在儲存圖時,自己到自己的邊應當去除

無向邊:區別只在於儲存圖的時候,存兩邊,一去一回。

int x,y,z;

cin >> x >> y >> z;

if(x!=y)

最短路總結(1)

最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑 這篇文章就是介紹幾種關於最短路徑的幾種演算法 1.定義 動態規劃以 途徑點集大小 為階段,以一種n nn的演算法,更新i j的最短路,列舉,乙個k點,為中轉點,然後判斷是直接的段還是間接的短 2.鄰...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路問題(1)

從圖中指定的一點出發走到某一目標點如果存在多種不同的走法,最短的是哪條路?其長度是多少?圖論中解決上述問題的方法都屬於最短路演算法。由於圖的特點不同 儲存結構不同 確立演算法的側重方向不同,所以演算法是多種多樣的。一 無權圖及樹網 在無權圖中,路徑長度只與路徑上的點數有關,而與路徑上的邊權和點權無關...