关于Bellman-Ford算法的实现

	一般简单的实现Bellman-Ford算法(包括之前的Dijkstra算法),都是用MAX_INT的值来表示无穷。这样如果distTo[x] = MAX_INT,就表示从起始点s到x这个点还不可达。基于这样的想法Bellman-Ford算法可以这样来写:

在这里插入图片描述
上面的代码由于使用伪码,所以代码行数比较少,思路看起来应该更清晰。
这里注意:在Bellman-Ford的pass那重循环里 ,由于distTo初始使用 了MAX_ INT, 所以我们可以很方便的直接判断if( distTo[e->v()] + e->wt() < distTo[e->w()])。
但是在实际情况下,使用MAX_ INT有很多不方便的地方(比如容易整型溢出)。因为在计算机里,这个数字毕竟不是真正的“无穷”。所以在我们课程的代码里,可以使用from这个数组来看: 对于每一个e, e->v(这个节点是否在之前的遍历中已经可达了。如果是已经可达的节点,才可以进一 步判断当前是否可以进行这个松弛操作。在我课程讲解的代码中缺少了对e->v()这个节点是否可达的判断。
另外,我们的课程代码中,第二重循环又对所有的顶点进行了一 次遍历。 这其实是基于我们自实现的这个Graph类,尝试对图中的所有边进行遍历的方式:先遍历所有顶点,再遍历所有顶点对应的邻边。
使用这样的方式,对于无向图来说,实每个边都被遍历了两次,不过这个小问题并不影响整个算法的正确性。如果有兴趣,也可以思考一下为Graph类添加一 个针对图中所有的边进行遍历的迭代器是一个不错的练习,也能加深对迭代器的认识: )
我修改过的Bellman-Ford代码如下,加入了更多注释。希望大家可以理解: )
在这里插入图片描述
在这里插入图片描述
github代码库:https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/09-Shortest-Path/Course%20Code%20(C%2B%2B)/05-Implementation-of-Bellman-Ford/BellmanFord.h

发布了37 篇原创文章 · 获赞 0 · 访问量 716

猜你喜欢

转载自blog.csdn.net/weixin_43704007/article/details/104703261