Dijkstra算法的认识

Dijkstra算法步骤:

1.初使时令 S={V0},T={其余顶点},T中顶点对应的距离值, 若存在,为弧上的权值,若不存在,为Inf。

2.从T中选取一个其距离值为最小的顶点W加入S。对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值(此过程称为relax)。

3.重复上述步骤,直到S中包含所有顶点,即S=V为止(说明最外层是除起点外的遍历)。

以上摘自:http://www.cnblogs.com/hxsyl/p/3270401.html


Dijkstra为什么不能用于负权边图:

Dijkstra算法基于的思想是,确定在了集合S之中的点,那么初始点到达这些点的值就是最短的了,不会有变化。

后面的点,要么由初始点到达,要么经过S中的其他点到达。由于边权值为正,而且每次是选择T中到达初始点权值最小的点,可以保证每次加入S中的点都是最短路径。

然而如果有负权边:1.可能会破坏S中的点是最短路径的假设。比如A--B=6,B--C=-2,A--C=5.使用此算法就会直接将C点加入S集合中,得到A--C最短路径为5.实际上为A--B--C=4.

                  2.如果有负权环,会一直原地进行下去,达到任意小。

以上摘自:http://www.cnblogs.com/tanhehe/archive/2013/02/03/2890767.html


Dijkstra与Dantjig算法(标号法)

这两个算法我百度百科,发现都是在1959年提出的,但是没有直接比较它们两个的帖子。

如果搜索最短路径算法的话,不会出现Dantjig算法。不过楼主感觉Dantjig是Dijkstra的一种具体实现方式吧(不一定对)。

因为我发现Dantjig算法就是将Djikstra的“从T中选取一个其距离值为最小的顶点W加入S”这个步骤具体化了。

1.首先它将每个已经选入S中的点si,求最小一步可达的在T中的点(与si邻接的属于T的点可能有若干个,求出距离最小的那个),并设其距离为bi。

2.将每一个S中的点到初始点的距离加上对应的bi,这样可以求得最小的一个距离,然后得到的那个点就加入S中。


注:由1,2两个步骤可知,下一次计算的时候到达同一点的所有可能路径都会被纳入考虑,所以都不需要去刻意进行relax这个步骤了。





你可能感兴趣的:(算法与数据结构)