[图论]Floyd 算法小结

Floyd 算法小结

By Wine93 2013.11


1.Floyd算法简介

Floyd算法利用动态规划思想可以求出任意2点间的最短路径,时间复杂度为O(n^3),对于稠密图效率要高于执行|V|Dijkstra算法.

核心代码如下:

for(k=1;k<=n;k++)

     for(i=1;i<=n;i++)

         for(j=1;j<=n;j++)

             dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);

相关应用 有向图: ①求任意2点间最短路径  ②求最小环(可判断负圈,检查dis[i][i])   ③求传递闭包

                无向图:(无负权边): ①求任意2点间最短路径  ②求最小环

注意:对于有负权边的无向图,会出现很多意想不到的错误,请谨慎使用floyd


2. 个人心得

对于floyd,我认为最重要的是理解k循环这层,每枚举一个k,代表下面代表的点对(ij)之间的 最短路有可能会通过k这点而变小,也就是说在ij的这条简单路径上插上k这个点,有可能会使路径长度变小。还有就是floyd求出来的最短路径肯定是简单路径(无向图)

关于可Floyd解的题其顶点数都比较小,根据这点会给我们一点暗示.

如果要输出floyd所求相关路径,我们可以记录mid[i][j](表示ij这条路径中插入的点k),这样通过不断递归,就可以求出整条路径


3. Floyd算法的应用举例

(1) 求无向图最小环 

HDU 1599 find the mincost route      POJ 1734 Sightseeing trip(需输出最小环)  

相关证明理解请参考下面博客,讲解的非常好:


(2)判断有向图是否有正环

POJ 2240 Arbitrage


(3)传递闭包

 POJ 3660 Cow Contest


(4)好题推荐(独立完成)

HDU 3631 Shortest Path    //深入理解floyd

HDU 4034 Graph               //深入理解floyd ,思维锻炼


4. 个人总结

Floyd算法有很多其他的应用,需要不断的积累,但是我相信只要能理解好floydDP思想(每个k点插入或者不插入相关路径),很多问题多能迎刃而解.


附录:关于Floyd判断环的可行性


注:该附录未经严格验证,请读者认真思考 


你可能感兴趣的:(专题小结集合——图论)