USACO算法系列十三(续)

      好长一段时间没有碰算法了。一方面最近导师的事情比较多,另一方面最近碰到一些很不开心的事情,而且接二连三的,导致自己堕落了好长一段时间。

      立志不坚,终不济事。以后要坚持下去,而且把原先落下的一一补回来。

      接着说那道题吧,其实这道题的思路很简单。也就是很简单的最短路径算法。最常用的算法包括以下几种:

      1 Dijkstra算法

      2 Bellman-Ford算法

      3 SPFA算法:是对Bellman-Ford算法的改进

      4 Floyd-Warshall算法

      5 Johnson算法

      在这道题目中,上一次使用的最短路径算法是Folyd-Warshall算法,复杂度为O(800 ^ 3),很显然超时了。如果用Bellman-Ford算法的话,本身Bellman-Ford算法针对每一个S点的时间复杂度为O(V * E ),V为节点数,E为边数。因此针对任意一个节点的时间复杂度为O( V * V * E),最复杂情况为O( 800 * 800 * 1450),明显比Folyd-Warshall算法效率还差,所以我觉得可能要使用改进的Bellman-Ford算法——SPFA算法。但是Bellman-Ford算法有一个小的优化,可以将时间复杂度将为O( K * E )。就是设个标志,判断是否改变,如果没有改变的话,则直接跳过剩下的循环。大家可以具体学习一下。抱着幸运的态度,试了一把,居然过了,大大出乎我的意料之外。

     源码如下:

     运行效果如下:

     基础是很重要的。

     另外参考答案里面提出了好多我以前从来没有用过的东西,各种堆算法,有空要好好复习,然后实现一下。

     业精于勤荒于嬉,行成于思而毁于随。算是对这颓废的一个月的一次总结吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值