最短路徑問題的複習整理(2)
最短路徑問題的複習整理–優化篇
問題簡述:
求從v0出發經過乙個無向網到各個頂點的最短路徑及相應權的大小
我們最常用的還是迪傑斯特拉演算法
基本實現思路:
(1)就是先找出和當前頂點直接連通的頂點,記錄邊上相應權到陣列d,達不到的記為inf
(2)繼續對相應權最小的邊上的那個頂點進行同樣的尋找,更新陣列d,記錄頂點序號
(3)重複(1)(2),直到擴充套件到終點為止
工具使用:
1.鄰接矩陣mg
2.陣列d記錄最小權
3.陣列p記錄最小路徑(每個值記錄的是前驅頂點序號)
**實現(省略了基本結構的建立)
void
dijkstra
(mgraph &mg,
int s, path& p, shortest& d)
d[s]=0
; final[s]=1
;for
(int i =
1; i < mg.vexes; i++)}
final[k]=1
;for
(int j =
0; j < mg.vexes; j++)}
}}
我們知道dijkstra演算法計算的是v0到各個頂點的最短路徑,這是可以發現乙個明顯的缺陷,我們並沒有辦法知道其他頂點到各個頂點的最短路徑,這時我們就要思考另一種解決方法了
問題簡述:
求從各個頂點出發經過乙個無向網到各個頂點的最短路徑及其權的大小
基本實現思路:
(1)記錄從乙個起始頂點到乙個終端頂點的權m1
(2)從與該兩頂點都直接連通的頂點中依次選定頂點作為中轉點,若起始頂點經過這個中轉點到終端頂點的總權m2小於m1,記錄相應權值及中轉點
乙個公式概括就是:
d[i][j] = min
實現工具:
(1)鄰接矩陣
(2)二維陣列p記錄最小路徑(每個值記錄的是前驅頂點序號)
(3)二維陣列d記錄最小權值
**實現(省略基本結構建立)
void
floyd
(mgraph &mg, path &p, shortest &d)
}for
(k =
0; k < mg.vexes; k++)}
}}}
最短路徑問題的複習整理(2)
最短路徑問題的複習整理 1 最短路徑問題的複習整理 優化篇 對最短路徑問題 1 的補充 相對於迪傑斯特拉演算法,它在沒有負圈的情況最多更新v 1次,因此它適用於存在負邊的情況,並且可以判斷是否存在負圈 判斷是否更新了v次以上 實現 貝爾曼福德演算法 o ve 適用於負邊 下面例子是對dag進行操作 ...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...