最短路径算法学习
2014-12-01 21:26
253 查看
转自:最短路径算法深入分析
一、戴克斯特拉算法(Dijkstra algorithm)
该算法解决的是有向图中单个源点到其他顶点的最短路径问题。
戴克斯特拉算法的实现过程如下:
第一步:用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
第二步:设S为已求得的从某一顶点v始发的最短路径的终点的集合,且S的初始状态为空,初始化时,将始发顶点置于S集合中。那么从v出发到图中其余各个顶点vi可能达到的最短路径长度的初值为D[i]。
第三步:选择一顶点vj,使得vj就是当前求得的一条从顶点v出发的最短路径的终点。此时令S = S ∪ {vj}。
第四步:修改从v出发到集合V-S(V为图顶点的集合)中任一顶点vk可达的最短路径长度。如果D[j]+WeiArcs[j][k] < D[K],则D[k] = D[j] + WeiArcs[j][k]。
第五步:重复操作第三步、第四步共N-1次,由此就能求得从v出发到图中其余各个顶点的最短路径。
好了,实现过程就是这样。不过光有文字描述不行,要更直白的表达这个过程,我认为用图像表述是一个很好的选择。如下图所示
![](http://my.csdn.net/uploads/201204/19/1334836868_6500.jpg)
![](http://my.csdn.net/uploads/201204/19/1334836904_9178.jpg)
![](http://my.csdn.net/uploads/201204/19/1334837022_9657.jpg)
从运算过程表中,我们可知v0到其余个点的最短路径,如下图
![](http://my.csdn.net/uploads/201204/19/1334837119_9973.jpg)
二、弗洛伊德算法(Floyd algorithm)
该算法解决的是有向带权图中两顶点之间最短路径的问题。
弗洛伊德算法的设计过程如下:
用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
要求:求节点vi到节点vj的最短路径。
设D(i,j,k)为从节点vi到节点vj的以vk(vk∈(0,1,...k))节点为中间节点的最短路径的长度。例如:从vi到vj这条路径上经过节点vm和节点vk,那么可表示为:vi-->vm-->vk-->vj。
那么,就有:1.若最短路径经过节点vk,则D(i,j,k) = D(i,k,k-1) + D(k,j,k-1);
2.若最短路径不经过节点vk,则D(i,j,k) = D(i,j,k-1)。
所以,求的vi到vj的最短路径可表示为:
D(i,j,k) = min(D(i,k,k-1) + D(k,j,k-1), D(i,j,k-1))。
一、戴克斯特拉算法(Dijkstra algorithm)
该算法解决的是有向图中单个源点到其他顶点的最短路径问题。
戴克斯特拉算法的实现过程如下:
第一步:用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
第二步:设S为已求得的从某一顶点v始发的最短路径的终点的集合,且S的初始状态为空,初始化时,将始发顶点置于S集合中。那么从v出发到图中其余各个顶点vi可能达到的最短路径长度的初值为D[i]。
第三步:选择一顶点vj,使得vj就是当前求得的一条从顶点v出发的最短路径的终点。此时令S = S ∪ {vj}。
第四步:修改从v出发到集合V-S(V为图顶点的集合)中任一顶点vk可达的最短路径长度。如果D[j]+WeiArcs[j][k] < D[K],则D[k] = D[j] + WeiArcs[j][k]。
第五步:重复操作第三步、第四步共N-1次,由此就能求得从v出发到图中其余各个顶点的最短路径。
好了,实现过程就是这样。不过光有文字描述不行,要更直白的表达这个过程,我认为用图像表述是一个很好的选择。如下图所示
![](http://my.csdn.net/uploads/201204/19/1334836868_6500.jpg)
![](http://my.csdn.net/uploads/201204/19/1334836904_9178.jpg)
![](http://my.csdn.net/uploads/201204/19/1334837022_9657.jpg)
从运算过程表中,我们可知v0到其余个点的最短路径,如下图
![](http://my.csdn.net/uploads/201204/19/1334837119_9973.jpg)
二、弗洛伊德算法(Floyd algorithm)
该算法解决的是有向带权图中两顶点之间最短路径的问题。
弗洛伊德算法的设计过程如下:
用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
要求:求节点vi到节点vj的最短路径。
设D(i,j,k)为从节点vi到节点vj的以vk(vk∈(0,1,...k))节点为中间节点的最短路径的长度。例如:从vi到vj这条路径上经过节点vm和节点vk,那么可表示为:vi-->vm-->vk-->vj。
那么,就有:1.若最短路径经过节点vk,则D(i,j,k) = D(i,k,k-1) + D(k,j,k-1);
2.若最短路径不经过节点vk,则D(i,j,k) = D(i,j,k-1)。
所以,求的vi到vj的最短路径可表示为:
D(i,j,k) = min(D(i,k,k-1) + D(k,j,k-1), D(i,j,k-1))。
相关文章推荐
- 算法学习-最短路径条数问题(队列相关)
- 算法学习-最短路径算法
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- ospf学习-----SPF最短路径算法
- 学习笔记---街区最短路径问题算法及优化
- 最短路径的算法的学习
- 最短路径算法学习总结
- 算法学习笔记——Dijkstra单源最短路径算法
- 学习日志---最短路径算法
- 学习图算法----最短路径问题
- 迷宫最短路径算法(使用队列)
- 也谈迷宫算法(最短路径 队列)+源程序
- floyd最短路径算法的实现
- 最短路径算法及应用
- Dijkstra 最短路径算法的一种高效率实现
- Dijkstra 最短路径算法的一种高效率实现
- 单源点最短路径算法的设计与实现
- 前k条最短路径算法