迪杰斯特拉算法(Dijkstra算法)

这是一个求图中最短路径的问题,即带权图中求一个顶点到另外任一顶点的最小距离。

以下图为例,图画的比较丑,莫喷。双向箭头表示无向图。

迪杰斯特拉算法(Dijkstra算法)_第1张图片

如果我们计算A点到其他点的最短距离,那么我们构建过程是这样的:

一列表示一次迭代

开始节点集为A一个,每一次迭代,从节点集中找到到其他节点的最短距离,并将最小的节点计入节点集中,进入下一次迭代。直到所有的节点都进入到节点集中。

终点\轮数

1

2

3

4

5

6

B

6(ADB)

6(ADB)

 

 

 

C

12(ADBC)

8(ADGEC)

8(ADGEC)

D

4(AD)

 

 

 

 

 

E

6(ADGE)

6(ADGE)

 

 

F

6(AF)

6(AF)

6(AF)

6(AF)

6(AF)

 

G

5(ADG)

 

 

 

 

节点

A,D

A,D,G

A,D,G,B

A,D,G,B,E

A,D,G,B,E,F

A,D,G,B,E,F,C

 问题是如何证明这个方法是对的?如何证明我们的推导过程能使得   已确定的最小距离的路径   在增加了新的节点进入节点集以后    不会出现新的路径使距离更短?

问题等价于证明:我们的推导过程能使得,假设S为已求得最短路径的终点的集合,下一条最短路径(设其终点为x)是只经过S的顶点到达x的,不会出现经过S以外的点到达x的情况。

证明:

反证法,倘若出现了一个顶点y不在S中,那么说明了存在一条路径经过y而长度比到x的更短。但是,根据我们的推导过程,这是不可能的。

因为按照我们的推导方式,只要这个顶点没有被加入顶点集,那么y应该拿出来和x比较看谁更小更有资格成为更短路径,比较的结果是y取代x成为最短路径,结果是x不能成为最短路径,这与原命题是矛盾的。

这种情况在我们的推导过程中不可能出现,也就是说我们的推导过程能满足原命题。



你可能感兴趣的:(c,算法)