简介:Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名
如果需要求出每两点之间的最短路,不必调用n次Dijkstra(边权均为正)或者Bellman-ford(有负权)。有一种跟简单的实现算法-Floyd-Warshall算法
代码如下:
void Floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ if(d[i][k]<INF&&d[k][j]<INF)///防止INF过大溢出 d[i][j]=min(d[i][j],d[i][k]+d[k][j]);///对于不同的问题此处可以做出相应的改变 } }
Floyd算法注意事项:使用前需初始化,d[i][i]=0,其他d值为“正无穷”INF。注意INF的取值,防止溢出即可
其他应用:
1、求图中任意两点之间的最小距离
2、求图中从x到y的所经过的边中边权值最大的或最小的(Uva10048)
3、求图中任意两点之间是否有通路:在有向图中,有时不必关心路径的长度,而至关心每两点之间是否有通路,则可以使用1、0分别表示连通和不连通。这样除了需要做少些预处理外,主算法只需要改为:d[i][j]=d[i][j]||(d[i][k]&&d[k][j]);这样的结果成为有向图的传递闭包(Uva247)
优缺点:
Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高O(n^3),不适合计算大量数据。