数学最短路径问题最方便的解法是什么

如题所述

用于解决最短路径问题的算法被称做“最短路径算法” ,有时被简称作“路径算法” 。最常用 的路径算法有: Dijkstra 算法、 A*算法、 SPFA 算法、 Bellman-Ford 算法和 Floyd-Warshall 算法, 本文主要介绍其中的三种。 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两 结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题:即已知起始结点,求最短路径的问题。 确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的 问题。 在无向图中该问题与确定起点的问题完全等同, 在有向图中该问题等同于把所有路径 方向反转的确定起点的问题。 确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。 全局最短路径问题:求图中所有的最短路径。 Floyd 求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度 O(V^3)。 Floyd-Warshall 算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法, 可以正确处理有向图或负权的最短路径问题。 Floyd-Warshall 算法的时间复杂度为 O(N^3),空间复杂度为 O(N^2)。 Floyd-Warshall 的原理是动态规划: 设 Di,j,k 为从 i 到 j 的只以(1..k)集合中的节点为中间节点的最短路径的长度。 若最短路径经过点 k,则 Di,j,k = Di,k,k-1 + Dk,j,k-1; 若最短路径不经过点 k,则 Di,j,k = Di,j,k-1。 因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。 在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。 Floyd-Warshall 算法的描述如下: 1.for k ← 1 to n do 2.for i ← 1 to n do 3.for j ← 1 to n do 4.if (Di,k + Dk,j<Di,j) then 5.Di,j ← Di,k + Dk,j; 其中 Di,j 表示由点 i 到点 j 的代价,当 Di,j 为∞表示两点之间没有任何连接。 Dijkstra 求单源、无负权的最短路。时效性较好,时间复杂度为 O(V*V+E) 。 源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV) 。 当是稀疏图的情况时,此时 E=V*V/lgV,所以算法的时间复杂度可为 O(V^2) 。若是斐波那 契堆作优先队列的话,算法时间复杂度,则为 O(V*lgV + E) 。 Bellman-Ford 求单源最短路,可以判断有无负权回路(若有,则不存在最短路) ,时效性较好,时间复杂 度 O(VE) 。 Bellman-Ford 算法是求解单源最短路径问题的一种算法。 单源点的最短路径问题是指:给定一个加权有向图 G 和源点 s,对于图 G 中的任意一点 v, 求从 s 到 v 的最短路径。 与 Dijkstra 算法不同的是,在 Bellman-Ford 算法中,边的权值可以为负数。设想从我们可以 从图中找到一个环路(即从 v 出发,经过若干个点之后又回到 v)且这个环路中所有边的权 值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处 理这个负环路,程序就会永远运行下去。而 Bellman-Ford 算法具有分辨这种负环路的能力。 SPFA是 Bellman-Ford 的队列优化,时效性相对好,时间复杂度 O(kE)(k<<V) 。 。 与 Bellman-ford 算法类似, SPFA 算法采用一系列的松弛操作以得到从某一个节点出发到达图 中其它所有节点的最短路径。所不同的是,SPFA 算法通过维护一个队列,使得一个节点的 当前最短路径被更新之后没有必要立刻去更新其他的节点, 从而大大减少了重复的操作次数。 SPFA 算法可以用于存在负数边权的图,这与 dijkstra 算法是不同的。 与 Dijkstra 算法与 Bellman-ford 算法都不同,SPFA 的算法时间效率是不稳定的,即它对于不 同的图所需要的时间有很大的差别。 在最好情形下,每一个节点都只入队一次,则算法实际上变为广度优先遍历,其时间复杂度 仅为 O(E)。另一方面,存在这样的例子,使得每一个节点都被入队(V-1)次,此时算法退化为 Bellman-ford 算法,其时间复杂度为 O(VE)。 SPFA 算法在负边权图上可以完全取代 Bellman-ford 算法, 另外在稀疏图中也表现良好。 但是 在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的 Dijkstra 算法,以及 它的使用堆优化的版本。通常的 SPFA 算法在一类网格图中的表现不尽如人意。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-26
Dijkstra算法

Dijkstra
算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到
达顶点的最短路径问题。

设G=(V,E)是一个有向图,V表示顶点,E表示边。它的每一条边(i,j)属于E,都有一个非负权W(I,j),在G中指定一个结点v0,要求把从v0到G的每一个接vj(vj属于V)的最短有向路径找出来(或者指出不存在)。
Dijstra
算法是运用贪心的策略,从源点开始,不断地通过相联通的点找出到其他点的最短距离

基本思想是:
设置一个顶点的集合s,并不断地扩充这个集合,一个顶点属于集合s当且仅当从源点到该点的路径已求出。开始时s中仅有源点,并且调整非s中点的最短路径长度,找当前最短路径点,将其加入到集合s,直终点在s中。

基本步骤:

1、把所有结点分成两组:

第一组:包括已经确定最短路径的结点;

第二组:包括尚未确定最短路径的结点。

2、开始时,第一组只包含起点,第二组包含剩余的点;

3、用贪心的策略,按最短路径长度递增的顺序把第二组的结点加到第一组去,直到v0可达的所有结点都包含于第一组中。在这个过程中,不断更新最短路径,总保持从v0到第一组各结点的最短路径长度dist都不大于从v0到第二组任何结点的路径长度。

4、每个结点对应一个距离值,第一组结点对应的距离就是v0到此结点的最短路径长度,第二组结点对应的距离值就是v0由第一组结点到此结点的最短路径长度。

5、直到所有的顶点都扫描完毕(v0可达的所有结点都包含于第一组中),找到v0到其它各点的所有最短路径。本回答被提问者和网友采纳
第2个回答  2015-02-17
过某一直线(称作y)做对称点,连接对称点与另一点,与y的交点为所求
第3个回答  2015-02-17
两点之间,线段最短?
第4个回答  2015-02-17
矢量和!!!!!!
相似回答