① 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算法的优缺点分析
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直接相连。