最短路徑問題,通俗地說,就是尋找乙個圖(有向圖或無向圖)兩點之間的最短路徑。下面我們討論的都是帶權圖的最短路徑問題,即找出兩點之間總權值最小的路徑的權值;因此,我們可以把最短路徑理解為最小(權)路徑。
聽起來可能會有些繞口,我們不妨舉個例項。乙個人若是有急事要開車從乙個城市到另乙個城市,而我們已知地圖上所有的路徑及它們的權值(這裡的路徑權值可以理解為行駛速度、路程長度、費用等綜合值;亦即是說,權可以理解為路徑的代價),那麼我們怎麼知道從這個城市行駛到另乙個城市的最小總權值呢?
1、求圖中一點到其他所有點的最短路徑,稱為單源最短路問題,相關演算法有dijkstra、bellman-ford、spfa;
2、已知起點、終點求最短路徑,它可以轉換為1類問題,也就是說求出起點到其它所有點的最短路徑,從而求出起點到終點的最短路徑,目前來說這種方法求解效率最佳;
3、已知終點,求其他所有點到終點的最短路徑,它可以反向轉換為1類問題求解;
4、給出多對任意起點終點求最短路徑,稱為多源最短路問題,它可以轉化為若干個1類問題求解,但也有其它簡便的演算法,如floyed。
下面定義一些函式與集合,之後介紹的演算法都如其含義:
設g=(v,e),其中v是點集,e是點對集(邊集),|v|表示v的元素個數即頂點數,ω(u,v)表示點u到點v的邊權(若兩點有邊相連);特別地,當g是無向圖時,ω(u,v)=ω(v,u)。為了區分兩點間有邊或是無邊,一般我們會把ω(u,v)初始為特殊值如0,-1或+∞,再在輸入圖時給有邊的兩點賦值為它們的邊權。我們再設δ(i,j)表示點i到點j的最小總邊權(即從i到j,經過的最小邊權之和),對於上面的問題,我們可以這樣定義:
1、求δ(i,j),其中i是起點,j是終點且j=1,2,..,|v|;
2、求δ(i,j),其中i是起點,j是終點;
3、求δ(i,j),其中i是起點,j是終點且i=1,2,..,|v|;
4、求δ(i,j),其中i是起點,j是終點且i=1,2,..,|v|,j=1,2,..,|v|;
另外,還有一些特殊概念的定義:
1、負權邊
負權邊指的是圖中邊權為負數的邊,它對一些演算法如dijkstra的決策有影響,因此要根據實際問題選擇對應演算法。
2、負環
最短路徑問題有無解的情況,即圖中存在負環時。負環又稱負權迴路,即從乙個點u出發,存在一條路徑使得δ(u,u)<0(即走過一條路徑回到自己時經過的總邊權小於0)。
證明:因為圖存在負環,所以必定可以找到一條路徑使得δ(u,u)<0,那麼只要無限地走這個負環,它的總權值總是更優,即趨於越來越小直到-∞。因此存在負環的圖最短路徑問題無解。
特別地,對於乙個無向圖,顯然只要存在負權邊即存在負環。
了解這些概念之後,我們可以去學習一下最短路的相關演算法。
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路徑演算法概述
背景 前段時間應朋友所求,她兒子幼兒園的校車滿城跑,去全城不同的站點接送小孩,而每次她的接送點都需要等待,因此想自己為幼兒園校車規劃一條最省時間的接送路線 用於解決最短路徑問題的演算法被稱做 最短路徑演算法 有時被簡稱作 路徑演算法 最常用的路徑演算法有 dijkstra演算法 spfa演算法 be...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...