导航:首页 > 源码编译 > floyd优化算法

floyd优化算法

发布时间:2024-06-04 02:06:41

① Floyd算法的算法过程

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

② floyd绠楁硶 鏄锷ㄦ佽勫垝镄勬濇兂钖

1.瀹氢箟姒傝

Floyd-Warshall绠楁硶锛团loyd-Warshall algorithm锛夋槸瑙e喅浠绘剰涓ょ偣闂寸殑链鐭璺寰勭殑涓绉岖畻娉曪纴鍙浠ユg‘澶勭悊链夊悜锲炬垨璐熸潈镄勬渶鐭璺寰勯梾棰桡纴钖屾椂涔熻鐢ㄤ簬璁$畻链夊悜锲剧殑浼犻挜棴鍖呫侳loyd-Warshall绠楁硶镄勬椂闂村嶆潅搴︿负O(N3)锛岀┖闂村嶆潅搴︿负O(N2)銆

2.绠楁硶鎻忚堪

1)绠楁硶镐濇兂铡熺悊锛

Floyd绠楁硶鏄涓涓缁忓吀镄勫姩镐佽勫垝绠楁硶銆傜敤阃氢织镄勮瑷𨱒ユ弿杩扮殑璇濓纴棣栧厛鎴戜滑镄勭洰镙囨槸瀵绘垒浠庣偣i鍒扮偣j镄勬渶鐭璺寰勚备粠锷ㄦ佽勫垝镄勮掑害鐪嬮梾棰桡纴鎴戜滑闇瑕佷负杩欎釜鐩镙囬吨鏂板仛涓涓璇犻喷锛堣繖涓璇犻喷姝f槸锷ㄦ佽勫垝链瀵屽垱阃犲姏镄勭簿鍗庢墍鍦锛

浠庝换镒忚妭镣筰鍒颁换镒忚妭镣筳镄勬渶鐭璺寰勪笉澶栦箮2绉嶅彲鑳斤纴1鏄鐩存帴浠巌鍒癹锛2鏄浠巌缁忚繃鑻ュ共涓鑺傜偣k鍒癹銆傛墍浠ワ纴鎴戜滑锅囱綝is(i,j)涓鸿妭镣箄鍒拌妭镣箆镄勬渶鐭璺寰勭殑璺濈伙纴瀵逛簬姣忎竴涓鑺傜偣k锛屾垜浠妫镆Dis(i,k) + Dis(k,j) < Dis(i,j)鏄钖︽垚绔嬶纴濡傛灉鎴愮珛锛岃瘉鏄庝粠i鍒発鍐嶅埌j镄勮矾寰勬瘆i鐩存帴鍒癹镄勮矾寰勭煭锛屾垜浠渚胯剧疆Dis(i,j) = Dis(i,k) + Dis(k,j)锛岃繖镙蜂竴𨱒ワ纴褰撴垜浠阆嶅巻瀹屾墍链夎妭镣䇲锛娈is(i,j)涓璁板綍镄勪究鏄痠鍒癹镄勬渶鐭璺寰勭殑璺濈汇

2).绠楁硶鎻忚堪锛

a.浠庝换镒忎竴𨱒″崟杈硅矾寰勫紑濮嬨傛墍链変袱镣逛箣闂寸殑璺濈绘槸杈圭殑𨱒冿纴濡傛灉涓ょ偣涔嬮棿娌℃湁杈圭浉杩烇纴鍒欐潈涓烘棤绌峰ぇ銆 銆銆

b.瀵逛簬姣忎竴瀵归《镣 u 鍜 v锛岀湅鐪嬫槸钖﹀瓨鍦ㄤ竴涓椤剁偣 w 浣垮缑浠 u 鍒 w 鍐嶅埌 v 姣斿繁鐭ョ殑璺寰勬洿鐭銆傚傛灉鏄镟存柊瀹冦

3).Floyd绠楁硶杩囩▼鐭╅樀镄勮$畻----鍗佸瓧浜ゅ弶娉

鏂规硶锛氢袱𨱒$嚎锛屼粠宸︿笂瑙掑紑濮嬭$畻涓鐩村埌鍙充笅瑙 濡备笅镓绀

缁椤嚭鐭╅樀锛屽叾涓鐭╅樀A鏄闾绘帴鐭╅樀锛岃岀烦阒礟ath璁板綍u,v涓ょ偣涔嬮棿链鐭璺寰勬墍蹇呴’缁忚繃镄勭偣

③ Floyd算法是什么

Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。
通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。
从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。
采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3); 其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]} map[i,j]表示i到j的最短距离 K是穷举i,j的断点 map[n,n]初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路

④ 銆愬师鍒涖戠畻娉旷郴鍒椻斺斿洓绉嶆渶鐭璺绠楁硶锛欶loyd锛娈ijkstra锛孊ellman-Ford锛孲PFA

绠楁硶涔嬫梾锛氭帰绱㈠洓绉岖粡鍏告渶鐭璺寰勭畻娉


鍦ㄨ$畻链虹戝︾殑杩峰涓锛屾渶鐭璺寰勭畻娉旷姽濡傜拃镨ㄧ殑鏄熻景锛岀収浜浜嗙绣缁滈氢俊镄勮矾寰勚傛湰鏂囧皢甯﹂嗕綘娣卞叆鐞呜ВFloyd-Warshall銆丏ijkstra銆丅ellman-Ford鍜孲PFA杩椤洓浣岖畻娉曟槑鏄燂纴瀹冧滑钖勮嚜浠ョ嫭鐗圭殑榄呭姏鍦ㄥ浘璁洪嗗烟闂钥銆傝╂垜浠涓璧锋彮寮瀹冧滑镄勯溃绾憋纴镒熷弹瀹冧滑镄勫阀濡欎笌濞佸姏銆

棣栧厛锛屾垜浠𨱒ュ埌Floyd-Warshall镄勬垮爞锛岃繖鏄涓鍦哄姩镐佽勫垝镄勭洓瀹淬傚畠镄勪唬镰佷紭闆呬笖绠娲侊纴阃氲繃涓夊眰寰鐜瀹炵幇浜嗗氭簮链鐭璺寰勭殑镆ユ垒锛屽叾鐘舵佽浆绉绘柟绋嫔疀濡备竴棣栦紭缇庣殑鏁板﹁疭绡囷细f[i][j] = min(f[i][j], f[i][k] + f[k][j])銆傝繖涓绠楁硶阃傜敤浜庢棤璐熸潈鐜锛屼絾绌洪棿闇姹傝缉楂桡纴涓篛(n^2)銆傞氲繃婊氩姩鏁扮粍镄勬妧宸э纴鎴戜滑鍙浠ヨ繘涓姝ヤ紭鍖栫┖闂存晥鐜囷纴璁╃畻娉曟洿锷犺交鐩堛

鎺ヤ笅𨱒ワ纴鎴戜滑杞钖慏ijkstra镄勮垶鍙帮纴杩欎綅璐蹇幂瓥鐣ョ殑寮曢呜呫傚畠涓撴敞浜庡崟婧愭渶鐭璺寰勶纴瀵硅竟镄勬潈閲嶆湁镌涓ユ牸镄勯潪璐熻佹眰銆侱ijkstra阃氲繃浼桦厛阒熷垪锛埚傚皬镙瑰爢鎴栨枑娉㈤偅濂戝爢锛夌殑宸у栾繍鐢锛屽皢镞堕棿澶嶆潅搴﹂檷浣庡埌O((E+n)lgn)锛屽湪绋鐤忓浘涓琛ㄧ幇鍑鸿壊銆傚叾镙稿绩镎崭綔锛屽傛彃鍏ュ拰銮峰彇链灏忓硷纴浣撶幇浜嗗爢镄勯珮鏁堟с

铹跺悗锛屾垜浠闱㈠圭殑鏄叠ellman-Ford鍜孲PFA杩椤归毦鍏勯毦寮熴侭ellman-Ford浠ュ叾镞犵晱镄勫媷姘旓纴鎺ョ撼浜呜礋𨱒冭竟鍜岀幆镄勬写鎴桡纴阃氲繃ne娆℃涧寮涙搷浣灭‘淇濈粨鏋灭殑鍑嗙‘镐с傝孲PFA锛屼綔涓筑ellman-Ford镄勪紭鍖栫増链锛岄氲繃阒熷垪绛栫暐阆垮厤浜嗕笉蹇呰佺殑𨱒惧绂锛屾椂闂村嶆潅搴﹂氩父琚璁や负鎺ヨ繎O(e)銆备絾闇娉ㄦ剰锛孲PFA鍦ㄧ壒瀹氭暟鎹涓嫔彲鑳藉彉寰椾笉绋冲畾锛娈ijkstra浠嶆槸棣栭夈

鍦ㄦ疮涓绠楁硶镄勬帰绱涓锛屾垜浠閮界湅鍒颁简鏁板︾殑涓ヨ皑涓庝唬镰佺殑𨱔靛阀浜ょ粐銆傚畠浠钖勮嚜鍦ㄥ勭悊涓嶅悓鍦烘櫙镞跺𪾢鐜板嚭镫鐗圭殑浠峰笺傝╂垜浠缁х画娣卞叆瀛︿範锛岀悊瑙e畠浠鑳屽悗镄勭悊璁哄拰瀹为檯搴旂敤锛岃╂渶鐭璺寰勭畻娉曞湪璁$畻链虹戝︾殑鑸炲彴涓婃紨缁庢洿绮惧僵镄勭瘒绔犮

璇风暀镒忥纴鏂愭尝闾e戝爢镄勪紭鍖栦细鍦ㄥ悗缁绔犺妭涓涓轰綘鎻绀烘洿娣卞眰娆$殑绠楁硶涔嬬编銆傛劅璋浣犵殑鍏虫敞锛屾湡寰呬綘镄勫弬涓庡拰鎸囨o纴璁╂垜浠涓璧峰湪杩欐浔绠楁硶涔嬫梾涓婂叡钖岃繘姝ワ紒

⑤ Floyd算法的优缺点分析

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。

⑥ 最短路径算法

最短路径的算法主要有三种: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的最短路径的距离。

三、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).

⑦ floyd算法能不能保证有最优解

Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。

算法过程:

把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=空值。

定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。
把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。

在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。

阅读全文

与floyd优化算法相关的资料

热点内容
李煜pdf 浏览:834
python写游戏逻辑 浏览:489
pdf转换成word免费版在线转换 浏览:462
荒废了三年还能做程序员吗 浏览:656
阿里云内网vpn服务器 浏览:101
l命令第一个点对第二个点对不上 浏览:829
oracle导出表命令 浏览:909
怎么写域名加密 浏览:1003
手机文件压缩出错 浏览:522
如何登录毒app 浏览:836
汽车中控台加密 浏览:862
海南农村信用社app如何开通短信 浏览:809
phpdns缓存 浏览:415
ipad腾讯视频app如何播放本地视频 浏览:990
虾米服务器关闭如何找到以前的歌 浏览:18
php自动建站 浏览:475
命令与征服3游侠网 浏览:970
腾讯云买哪个地区服务器 浏览:250
香港哪里有app卖内地零食 浏览:684
编译内核找不到工具链 浏览:455