最短路径算法

最短路径的算法主要有三种:floyd算法、Dijkstra算法、Bellman-Ford(贝尔曼-福特)

一、floyd算法

基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。 

二、Dijkstra算法

算法步骤:

a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

执行过程如图所示:

三、Bellman-Ford(贝尔曼-福特)

算法的流程如下:

给定图G(V, E)(其中V、E分别为图G的顶点集与边集),源点s,

1.数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为, Distant[s]为0;

2.以下操作循环执行至多n-1次,n为顶点数: 
对于每一条边e(u, v),如果Distant[u] + w(u, v) < Distant[v],则另Distant[v] = Distant[u]+w(u, v)。w(u, v)为边e(u,v)的权值; 
若上述操作没有对Distant进行更新,说明最短路径已经查找完毕,或者部分点不可达,跳出循环。否则执行下次循环;

3.为了检测图中是否存在负环路,即权值之和小于0的环路。对于每一条边e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的边,则图中存在负环路,即是说该图无法求出单源最短路径。否则数组Distant[n]中记录的就是源点s到各顶点的最短路径长度。

可知,Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E).



  • 鏈鐭矾寰鍥涘ぇ绠楁硶
    绛旓細鏈鐭矾寰勯棶棰樻槸鍥捐涓殑缁忓吀闂锛甯哥敤鐨勬渶鐭矾寰勭畻娉曟湁Dijkstra绠楁硶銆佽礉灏旀浖绂忕壒绠楁硶銆佸紬娲涗紛寰风畻娉曘丄绠楁硶銆侱ijkstra绠楁硶Dijkstra's Algorithm锛欴ijkstra绠楁硶鐢ㄤ簬姹傝В鍗曟簮鏈鐭矾寰勯棶棰橈紝鍗充粠缁欏畾璧风偣鍒板叾瀹冩墍鏈夎妭鐐圭殑鏈鐭矾寰勩傚畠閫氳繃閫愭鎵╁睍璺緞闀垮害鏉ヤ笉鏂‘瀹氬綋鍓嶈窛绂昏捣鐐规渶杩戠殑鑺傜偣锛屽苟鏇存柊鍏跺畠鑺傜偣鐨勮窛绂诲硷紝...
  • 鏈鐭矾寰勭畻娉
    绛旓細鏈鐭矾寰勭殑绠楁硶涓昏鏈変笁绉嶏細floyd绠楁硶銆丏ijkstra绠楁硶銆丅ellman-Ford(璐濆皵鏇-绂忕壒)涓銆乫loyd绠楁硶 鍩烘湰鎬濇兂濡備笅锛氫粠浠绘剰鑺傜偣A鍒颁换鎰忚妭鐐笲鐨勬渶鐭矾寰勪笉澶栦箮2绉嶅彲鑳斤紝1鏄洿鎺ヤ粠A鍒癇锛2鏄粠A缁忚繃鑻ュ共涓妭鐐筙鍒癇銆傛墍浠ワ紝鎴戜滑鍋囪Dis(AB)涓鸿妭鐐笰鍒拌妭鐐笲鐨勬渶鐭矾寰勭殑璺濈锛屽浜庢瘡涓涓妭鐐筙锛屾垜浠鏌is(AX...
  • 濡備綍姹鏈鐭矾寰?
    绛旓細v1鍒皏4锛8涓烘渶鐭矾寰锛泇1鍒皏5锛歷1-> v2 -> v5 =10+6= 16锛泇1v3v5=7+9=16;v1v4v6v5=8+5+2=15; 15涓烘渶鐭矾寰勶紱v1鍒皏6锛歷1v2v3v6=10+2+9=21锛泇1v3v6=7+9=16锛泇1v4v6=8+5=13锛13涓烘渶鐭矾寰勶紱v1鍒皏7锛歷1v2v5v7=10+6+20=36锛泇1v3v5v7=7+9+20=36锛泇1v3v6v7...
  • 鏈鐭矾寰勭畻娉浠嬬粛 鏈鐭矾寰勭畝浠
    绛旓細1銆佷粠鏌愰《鐐瑰嚭鍙戯紝娌垮浘鐨勮竟鍒拌揪鍙︿竴椤剁偣鎵缁忚繃鐨勮矾寰勪腑锛屽悇杈逛笂鏉冨间箣鍜屾渶灏忕殑涓鏉¤矾寰勫彨鍋氭渶鐭矾寰銆傝В鍐虫渶鐭矾鐨勯棶棰樻湁浠ヤ笅绠楁硶锛Dijkstra绠楁硶锛孊ellman-Ford绠楁硶锛孎loyd绠楁硶鍜孲PFA绠楁硶绛夈2銆佸畾涔夛細鏈鐭矾寰勯棶棰樻槸鍥捐鐮旂┒涓殑涓涓粡鍏哥畻娉曢棶棰橈紝鏃ㄥ湪瀵绘壘鍥撅紙鐢辩粨鐐瑰拰璺緞缁勬垚鐨勶級涓袱缁撶偣涔嬮棿鐨勬渶鐭...
  • 鏈鐭矾寰dijkstra绠楁硶
    绛旓細鏈鐭矾寰刣ijkstra绠楁硶濡備笅锛欴ijkstra杩澃鏂壒鎷夋槸涓绉嶅鐞嗗崟婧愮偣鐨勬渶鐭矾寰勭畻娉,灏辨槸璇存眰浠庢煇涓涓妭鐐瑰埌鍏朵粬鎵鏈夎妭鐐圭殑鏈鐭矾寰勫氨鏄疍ijkstra銆傝祫鏂欐嫇灞曪細杩澃鏂壒鎷夌畻娉(Dijkstra)鏄敱鑽峰叞鏁拌厰璁$畻鏈虹瀛﹀鐙勫厠鏂壒鎷変簬1959骞存彁鍑虹殑锛屽洜姝ゅ張鍙媱鍏嬫柉鐗规媺绠楁硶銆傛槸浠庝竴涓《鐐瑰埌鍏惰柉绾宠~浣欏悇椤剁偣鐨勬渶鐭矾寰勭畻娉...
  • 璺緞鎼滅储涓父鐢ㄧ殑dijkstra绠楁硶鏄湪鍥捐〃涓壘鍒颁粈涔堢殑鏂规硶?
    绛旓細璺緞鎼滅储涓父鐢ㄧ殑Dijkstra绠楁硶鏄湪鍥捐〃涓壘鍒板崟婧愭渶鐭矾寰勭殑鏂规硶銆侱ijkstra绠楁硶鏄绠楁満绉戝涓潪甯歌憲鍚嶅拰閲嶈鐨勭畻娉曚箣涓锛屼富瑕佺敤浜庤В鍐冲浘璁轰腑鐨勫崟婧愭渶鐭矾寰勯棶棰樸傝繖閲岀殑“鍗曟簮”鎸囩殑鏄粠涓涓寚瀹氱殑璧峰鑺傜偣锛堟垨绉颁负“婧”鑺傜偣锛夊嚭鍙戯紝鎵惧埌鍒拌揪鍥句腑鎵鏈夊叾浠栬妭鐐圭殑鏈鐭矾寰勩傝繖涓畻娉曠殑...
  • 鍥鹃亶鍘绠楁硶涔鏈鐭矾寰凞ijkstra绠楁硶
    绛旓細甯哥敤鐨勬渶鐭矾寰勭畻娉曞寘鎷細Dijkstra绠楁硶锛孉 绠楁硶锛孊ellman-Ford绠楁硶锛孲PFA绠楁硶锛圔ellman-Ford绠楁硶鐨勬敼杩涚増鏈級锛孎loyd-Warshall绠楁硶锛孞ohnson绠楁硶浠ュ強Bi-direction BFS绠楁硶銆傛湰鏂囧皢閲嶇偣浠嬬粛Dijkstra绠楁硶鐨勫師鐞嗕互鍙婂疄鐜般侱ijkstra绠楁硶锛岀炕璇戜綔鎴村厠鏂壒鎷夌畻娉曟垨杩澃鏂壒鎷夌畻娉曪紝浜1956骞寸敱鑽峰叞璁$畻鏈虹瀛﹀鑹惧吂璧皵.鎴村厠...
  • 绠杩癲ijkstra鏂规硶鐨勫熀鏈濇兂
    绛旓細Dijkstra鏄吀鍨嬫渶鐭矾寰勭畻娉曪紝鐢ㄤ簬璁$畻涓涓妭鐐瑰埌鍏朵粬鑺傜偣鐨勬渶鐭矾寰勩傝绠楁硶浣跨敤鐨勬槸璐績绛栫暐锛氭瘡娆¢兘鎵惧嚭鍓╀綑椤剁偣涓笌婧愮偣璺濈鏈杩戠殑涓涓《鐐广傜粰瀹氫竴甯︽潈鍥撅紝鍥句腑姣忔潯杈圭殑鏉冨兼槸闈炶礋鐨勶紝浠h〃鐫涓ら《鐐逛箣闂寸殑璺濈銆傛寚瀹氬浘涓殑涓椤剁偣涓烘簮鐐癸紝鎵惧嚭婧愮偣鍒板叾瀹冮《鐐圭殑鏈鐭矾寰勫拰鍏堕暱搴︾殑闂锛屽嵆鏄崟婧愭渶...
  • 鎬庝箞姹鏈鐭矾寰
    绛旓細3. 纭畾璧风偣缁堢偣鐨勬渶鐭矾寰勯棶棰 - 鍗冲凡鐭ヨ捣鐐瑰拰缁堢偣锛屾眰涓ょ粨鐐逛箣闂寸殑鏈鐭矾寰勩4. 鍏ㄥ眬鏈鐭矾寰勯棶棰 - 姹傚浘涓墍鏈夌殑鏈鐭矾寰勩傛秹鍙婄殑绠楁硶鍖呮嫭锛Dijkstra绠楁硶銆丄*绠楁硶銆丼PFA绠楁硶銆丅ellman-Ford绠楁硶銆丗loyd-Warshall绠楁硶銆丣ohnson绠楁硶绛夈傚彲鏍规嵁涓嶅悓鐨勯渶瑕侀夋嫨涓嶅悓鐨勭畻娉曘
  • dijkstra绠楁硶鏄粈涔?
    绛旓細Dijkstra绠楁硶鏄敱鑽峰叞璁$畻鏈虹瀛﹀鐙勫厠鏂壒鎷夛紙Dijkstra锛変簬1959骞存彁鍑虹殑锛屽洜姝ゅ張鍙媱鍏嬫柉鐗规媺绠楁硶銆傛槸浠庝竴涓《鐐瑰埌鍏朵綑鍚勯《鐐圭殑鏈鐭矾寰勭畻娉曪紝瑙e喅鐨勬槸鏈夊悜鍥句腑鏈鐭矾寰勯棶棰樸傚叾鍩烘湰鍘熺悊鏄細姣忔鏂版墿灞曚竴涓窛绂绘渶鐭殑鐐癸紝鏇存柊涓庡叾鐩搁偦鐨勭偣鐨勮窛绂汇傚綋鎵鏈夎竟鏉冮兘涓烘鏃讹紝鐢变簬涓嶄細瀛樺湪涓涓窛绂绘洿鐭殑娌℃墿灞...
  • 扩展阅读:dijkstra最短路径画图 ... 粒子群优化算法 ... 最短路径算法dijkstra ... a*算法 ... 初二数学最短路径问题 ... 最短路径12种类型例题 ... 最短路径排列组合算法 ... 贪心算法 ... dijkstra算法叫什么 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网