您的位置:首页 > 其它

[图论]Floyd 算法小结

2014-01-09 14:17 190 查看
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,代表下面代表的点对(i,j)之间的 最短路有可能会通过k这点而变小,也就是说在i到j的这条简单路径上插上k这个点,有可能会使路径长度变小。还有就是floyd求出来的最短路径肯定是简单路径(无向图)
关于可Floyd解的题其顶点数都比较小,根据这点会给我们一点暗示.
如果要输出floyd所求相关路径,我们可以记录mid[i][j](表示i到j这条路径中插入的点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算法有很多其他的应用,需要不断的积累,但是我相信只要能理解好floyd的DP思想(每个k点插入或者不插入相关路径),很多问题多能迎刃而解.

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



注:该附录未经严格验证,请读者认真思考 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: