最短路徑問題(Dijkstra)

2021-07-03 20:35:59 字數 1935 閱讀 7285

一、基本概念:

從起點出發找一條到達目的地的、邊權和最小的路徑,這就是單元最短路問題。

在最短路問題中,給出的是乙個有向加權圖g=(v,e),邊的權值是某種物理物件的度量標準,不一定是距離,它可以是時間,金錢,罰款,損失或任何其他路徑線性積累的數量形式。

路徑p=(v0,v1,......,vk)的權是指其組成邊的所有權值之和。定義u到v間最短路徑的權為:

最短路徑問題的3種型別:

1.單源最短路徑問題:找出從每一節點v到某指定節點u的一條最短路徑。把圖中的每條邊反向,我們就可以把這一問題轉化為單源最短路徑問題。

2.單對節點間的最短路徑問題:對於給定節點對u和v,找出從u到v的一條路徑。

3.每對節點間的最短路徑問題:對於每對節點u和v,找出從u到v的最短路徑。可以使用floyed-warshall演算法解決問題,但時間效率底下,且有不能出現負權迴路的苛刻條件。不妨以每個節點為源點執行一次單源演算法,以提高時效。

鬆弛技術是單源演算法的核心

所謂鬆弛技術,就是反覆減小每個節點的實際最短路徑的權的上限,直到該上限等於最短路徑的權為止。

定理:給定有向加權圖g=(v,e),設p=為從節點v1到節點vk的一條路徑,對任意i,j有i<=j<=k,設pij=為vi到vj的p的子路徑,則pij是從vi到vj的一條最短路徑。

給定有向加權圖g=(v,e),源點為s,則對於所有邊(u,v)∈e,有&(s,v)<=&(s,u)+w(u,v)。

鬆弛技術:

對每個節點v∈v,設定乙個屬性d[v]來描述從源點s到v的最短路徑的權的上界,稱之為最短路長估計,設定f[v]表示v點的父親。

proc initiallze_single_source(g,s);

d[s]:=0;

}鬆弛一條邊(u,v)的過程包括測試是否可通過節點u對目前找出的到v的最短路徑進行改進,如果可能則更新d[v]和f[v],一次鬆弛操作可以減小最短路長估計d[v]並更新v的父親f[v]。

proc relax(u,v,w);}

二、dijkstra演算法:

dijkstra演算法解決了有向加權圖的最短路徑問題,該演算法的條件是該圖所有邊的權值非負,即對於每條邊(u,v)∈e,w(u,v)>=0;

dijkstra演算法中設定了一節點集合s,從源節點r到集合s中節點的最終最短路徑的權均已確定,即對所有節點v∈s,有d[v]=&(r,v),並設定了最小優先佇列q,該佇列包含所有屬於v-s的節點(即這些節點尚未確定最短路徑的權),且以d值為關鍵字排列各節點。

初始時,q包含了除r外的其他節點,這些節點的d值為∞。r進入集合s,d[r]=0。演算法反覆從q中取出d值最小的節點u∈v-s,把u插入集合s中,並對u的所有出邊進行鬆弛。這一過程一直進行到q隊列為空為止。

只要圖中沒有負權邊,dijkstra演算法能夠順利完成。如果任何一條邊的權值為負,則演算法可能得出錯誤的答案。

procedure dijstra(g,w,r);}

dijkstra演算法的執行速度取決於優先佇列q的資料結構。有3種資料結構可供選擇:

(1)用一維陣列實現優先佇列,時間複雜度為o(v*v)。使用於規模不大的稠密圖。

(2)用二叉堆來實現優先佇列q,時間複雜度為o(elnv),使用於稀疏圖。

(3)用fibonacci堆實現優先佇列,時間複雜度優化為o(vlnv+e)。但fibonacci堆的程式實現相當繁瑣,程式的實際執行效果不理想,不推薦使用。

dijkstra演算法與prim演算法的異同:

同:都是屬於寬度優先搜尋,且優先佇列q都是以距離d為關鍵字排列的,節點出隊後都要進行鬆弛操作。

異:dijkstra演算法中的距離d是節點與源點間最短路長估計值,prim演算法中的距離d是節點連線生成樹的最短邊長。

變形:求出最短路的路徑

對於多條最短路存在的情況,求方案數

求次短路徑

習題:1.codevs1041

2.poj3013

3.poj1135

具體詳見:更加詳細哦)

最短路徑問題 dijkstra

description 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 輸入檔案short.in,共有n m...

最短路徑問題(Dijkstra)

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,...

最短路徑問題 Dijkstra

題目見 題目題目題目 解題思路 dijkstra是根據 白 點迴圈的,由第乙個白點 起始點 搜尋每一條邊,如果小於了原值就按照這乙個白點所連線的邊更新,找出所連線的最小值,那麼這乙個點就是下乙個白點。一直迴圈迴圈迴圈。所以這個會求出輸入的s 起始點 連線所有點的最小距離,但是不可以求出帶有負權值的圖...