最短路径问题

来源:互联网 发布:nodejs 数组排序 编辑:程序博客网 时间:2024/05/22 12:00

---------------------siwuxie095

  

  

  

  

  

  

  

最短路径问题

  

  

这里介绍最短路径(Shortest Path)问题

  

  

  

  

  

实现最短路径的算法,通常是针对连通带权有向图的,但由于

无向图本身也是一种特殊的有向图,所以对于无向图有向图

均成立

  

  

所谓最短路径问题,顾名思义,就是求出从一个顶点到另一个

顶点,耗费最小(即权值之和最小)的那条路径

  

  

  

  

  

最短路径问题在实际生活中有很多应用,如下:

  

1)路径规划

  

假如每个顶点表示一个城市,每条边表示城市之间道路的路程,

那么从一个城市到另一个城市,自然愿意选择一个路程最短的

道路

  

  

2)路由通信

  

假如在网络中,每个顶点表示一个路由器,每条边表示路由之

间通信的耗费,那么将一个网络包从一点发送到另一点,路由

器之间如何寻址,从而找到一个更优的路线,就是一个最短路

径问题

  

  

3)工作任务规划

  

假如在工作中,每个顶点表示一个工作任务,每条边表示工作

任务之间的时间,那么从一个工作任务到另一个工作任务,中

间选择完成哪些子任务耗费时间更少,也是一个最短路径问题

  

  

  

  

  

其实在无权图中,也有最短路径问题。对于无权图,从某顶点

开始进行广度优先遍历,结果其实就是求出了一个最短路径

  

更具体的,求出的是从一个顶点到其它所有顶点的最短路径

  

这样一来,就形成了一棵从起始顶点到其它所有顶点的树,通

常称这棵树为最短路径树(Shortest Path Tree)

  

不难看出,这棵树其实也是该无权图的生成树,它满足的性质

是:所有顶点到起始顶点的距离最小

  

  

  

求得最短路径树的过程,解决了一个通常称为单源最短路径

(Single Source Shortest Path)的问题

  

「单源,即只有一个起始点」

  

换句话说,广度优先遍历就是解决了在无权图中的单源最短路

径问题

  

  

  

  

  

那么在有权图中,又如何来解决单源最短路径问题呢?首先来

看无权图和有权图的区别,如下:

  

1)无权图的最短路径,将 0作为起始顶点

  

  

  

0开始,可以通过一条边到 1,即0-> 1,可以通过一条边

2,即0 -> 2

  

  

  

0开始进行广度优先遍历,就遍历到了 1 2,它们的路径

长度都是 1,如下:

  

  

  

此时在无权图中,显然已经是最短路径了,虽然0-> 2 -> 1

也是一条到达 1 的路径,但它不可能是比0->1 更短的路径

  

  

  

  

  

2)有权图的最短路径,将 0作为起始顶点

  

  

三条边都有权,权值如上图所示

  

  

  

0开始,可以通过一条边到 1,即0->1,可以通过一条边

2,即 0 -> 2,如下:

  

  

  

但此时,并不能确定只通过这一条路径(一条边)所得的权值

一定是最小的

  

  

  

由于从 2也可以通过一条边到 1,就要考察一下 0 -> 2 -> 1

是否比0 -> 1的路径还要短,如下:

  

  

  

显然,0-> 2 -> 1的路径是短于 0 -> 1的路径的。因此,

就找到了一条更短的路径

  

「注意:路径更短 即权值更小,路径权值」

  

  

  

  

  

求有权图的最短路径的过程:

  

前提条件:

  

1)起始顶点当前顶点相邻顶点

  

2)相邻顶点当前顶点的相邻顶点

  

  

操作如下:

  

从起始顶点开始

  

当到达当前顶点时,就尝试一下经过当前顶点到相邻顶点所得

到的路径,是否比不经过当前顶点到相邻顶点所得到的路径更

短。如果更短,就更新一下从起始顶点到相邻顶点的当前最短

路径

  

  

称这个操作为松弛操作(Relaxation)

  

  

松弛操作的核心当前顶点,看它的相邻顶点是否需要松弛,

每次松弛操作,实际上是对相邻顶点的访问

  

  

所谓松弛,其实是找到了一条更短的路径,但该路径的边数其

实更多,单从图上也能看出来,其实就是找到了一条直观上

了的路径,是一条更松的路径

  

  

「松弛操作,是最短路径问题求解的核心」

  

  

对于松弛操作,不管有多少个顶点,其实都可以看做是一个

角形操作,如下:

  

1)一条线:两个顶点:0-> 1

  

0 既是起始顶点,又是当前顶点,1 是相邻顶点

  

  

2)四边形:四个顶点:0 -> 1 -> 2 -> 3 0 -> 3,

0 -> 1 -> 2 加上 2 -> 3 的权值小于 0 -> 3 的权值

  

0 是起始顶点,2 是当前顶点,3 是相邻顶点

  

  

  

其它所有情况都是以上两种情况的变形,只要确认好起始顶点

当前顶点相邻顶点即可

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

原创粉丝点击