学算法就是学了忘,忘了学的过程。。。。
哎!
今天想看给旅行商问题找个模板,就看到了spfa算法,然后就到了bellman-ford算法,发现又忘记这个算法思想了。
原来的dijkstra算法是只能处理权重为非零的边的有向图,得到单源最短路(从一个顶点出发到其他顶点的最短路)
bellman-ford算法能处理一般情况(带负边)
算法思想是 将点分为两个集合,一类是已经得到最短路的点的集合S,另一类是得到的当前最短路的点的集合U
S最开始是只有出发点V0的集合,然后将V0到U中的点的距离最短的点X取出,将X放入S中,这个路径长度就是V0到X的最短路,
然后用x最作为中间节点去更新V0到U中各个点的路径长度。直到U为空集。
其实很好理解 V0 作为起点, 有V1到Vn n个点, 如果V0到 V1的路径长度是当前最短的了,那么不可能有任何一个顶点作为中间节点使得 V0-V1 大于 V0-Vx +Vx-V1 因为V0-V1 小于任何 V0-Vn (因为上面画红字的语句)
思路其实很简单
代码实现
回去看着算法书写百度感觉没找到靠谱的。。。