好长一段时间没有碰算法了。一方面最近导师的事情比较多,另一方面最近碰到一些很不开心的事情,而且接二连三的,导致自己堕落了好长一段时间。
立志不坚,终不济事。以后要坚持下去,而且把原先落下的一一补回来。
接着说那道题吧,其实这道题的思路很简单。也就是很简单的最短路径算法。最常用的算法包括以下几种:
1 Dijkstra算法
3 SPFA算法:是对Bellman-Ford算法的改进
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 )。就是设个标志,判断是否改变,如果没有改变的话,则直接跳过剩下的循环。大家可以具体学习一下。抱着幸运的态度,试了一把,居然过了,大大出乎我的意料之外。
源码如下:
运行效果如下:
基础是很重要的。
另外参考答案里面提出了好多我以前从来没有用过的东西,各种堆算法,有空要好好复习,然后实现一下。
业精于勤荒于嬉,行成于思而毁于随。算是对这颓废的一个月的一次总结吧。