前言
之前尝试过Dijkstra算法,用起来不错,想输出路径特别方便,但是有个问题,它不能解决负权边。
而今天的Bellman-Ford算法,就可以解决此问题。
实现功能
对带有负权的图求出两点之间的最短距离
输出实际路径
中文版参考
/**
* Bellman-Ford算法,可解负权边
* 这个算法既有Floyd-Warshall算法的影子,又有Dijkstra算法的味道。
*
* 其思想是遍历寻找其他顶点距离首个指定顶点的距离,暂时不能到达的为无穷大。
* 然后引入了一个中转的边,查看通过这个中转的边能否让两点距离变短。
* 再进行遍历寻找顶点1到其他顶点的最短距离,因为经过上面的一次遍历,已经有值改变了
* 此时会找出其他的点的最短路径,更新之
* 至多重复遍历n-1次即可完成最短路径的寻找
*
* 判断中转是否比较短的方法是
* 起点到目标顶点的距离 = Math.min(起点到目标顶点的[直接]距离, 起点经过其他顶点到达目标顶点的距离)
*
* 一般这样描述都很难懂,上实战
*
* 例如
* 起 终 权
* 2 3 2
* 1 2 -3
* 1 5 5
* 4 5 2
* 3 4 3
*
* 5个顶点
* 5条边
*
* 使用三个一维数组分别存储顶点起点、顶点终点、两个点之间的权值
* fromVertex toVertex weightVertex
* 使用一个dis数组,存储的是第一个起点,到达其他顶点的最短距离
* 初始为dis{
0, Inf, Inf, Inf, Inf}
* 处理第一条边
* 2 3 2
* 终点顶点是3,查看首个顶点到达顶点3的目前估计最短距离是: dis[toVertex[1]] = dis[3] = Inf
* 起点顶点时2,查看首个顶点到达顶点2的目前估计最短距离是: dis[fromVertex[1]] = dis[2] = Inf
* 顶点2到顶点3的权值是2
*
* 我们需要查看的是
* A:首个顶点到达顶点3的目前估计最短距离dis[3]
* B:首个顶点到达顶点2的目前估计最短距离dis[