本博客所有内容均整理自《算法图解》,欢迎讨论交流~
之前在引入图算法和广度优先搜索的时候,我举了一个旅行最短距离的例子,其实在那一节,广度优先搜索并没有解决那个例子的问题,在这里使用狄克斯特拉算法才可以真正解决赋权图的最短距离问题。
我们依然沿用那个例子。
假设你要从北京到成都去旅游,但是已经买不到北京直达成都的火车票或者飞机票了,于是你决定中转。现在有以下几种中转方案:
1、北京-乌鲁木齐-西安-成都
2、北京-合肥-武汉-成都
3、北京-大连-上海-重庆-成都
4、北京-九江-广州-昆明-成都
我们不考虑价格,仅仅考虑距离,这几种方案哪个距离最短呢?
其实这里我们首先要弄清楚的是,在这几种方案中,每两个城市之间的距离是多少。有了这些距离之后,我们才可以画出每种方案的图,把这些距离标在两个城市之间的连线上。这种边带有权值的图称为赋权图。
找到赋权图中前往X的最短路径,我们常使用狄克斯特拉算法。
1、狄克斯特拉算法的基本概念
关于狄克斯特拉算法的定义,百度百科是这样给出的:狄克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。狄克斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
下面来看看如何对下面的图使用这种算法。
对于上面的图,每条边都有一个权值,在这里代表从有向边的起点到终点所需的时间。如果我们需要找出从起点到达终点的最短路径,就可以使用狄克斯特拉算法来解决这个问题。
在使用狄克斯特拉之前,我们先来看看使用广度优先搜索算法来解决这个问题的结果,如下图所示: