单源点最短路径--2
2016-01-08 10:02
274 查看
4.有向无环图的单源点最短路径有向无环图的单源点最短路径只需要将所有的边进行一次松弛即可,但是松弛的顺序是先对图进行拓扑排序,排序后的序列便是堆结点的访问顺序,然后根据访问的顺序对其所有的出边进行一次松弛操作。例子:设置源结点为s即其时间设置为0。
其拓扑顺序为:r,s,t,x,y,z首先从r开始对其所有的出边进行一次松弛操作。结果如下所示:
绿色代表的是本次执行时的结点。从s出发对所有出边进行松弛。
从t出发对所有出边进行松弛。
从x出发对所有出边进行松弛。
从y出发对所有出边进行松弛。
从z出发对所有出边进行松弛。
5.Dijkstra[/b]算法[/b]Dijkstra算法解决的是带权的有向图上的单源点最短路径问题,但要求其权值不能为负数。一个实现很好的Dijkstra算法要比Bellman-ford算法运行时间要低。算法总是在V-S中选择最近的顶点加入到S集合中,所以说使用了贪心策略。V是顶点的集合,S是从源结点s到集合中的顶点的最终最短路径的权值均已经确定。例子:原图:
将s加入到S集合中,从s出发修改其邻接点的d值(从源结点s到v结点的最短路径的上界)。
选择一个距离s最近的y结点,将y加入S集合中,从y结点开始对每一条出边进行一次松弛操作。
选择一个不在S集合中的且d值最小的结点z,对z的所有的出边进行一次松弛操作。
选择一个不在S集合中的且d值最小的结点t,对t的所有的出边进行一次松弛操作。
最后一次操作:
代码实现:
总思路:1. 找到从源结点v0可达的结点中最短的一个结点v,将v加入到结果集finial中。2. 从该结点v出发,检测是否有一个结点w,使得minV
+ mygraph.weight[v][w] < D[w] ,若有则记录下来,记录其路径(w包括自己)
其拓扑顺序为:r,s,t,x,y,z首先从r开始对其所有的出边进行一次松弛操作。结果如下所示:
绿色代表的是本次执行时的结点。从s出发对所有出边进行松弛。
从t出发对所有出边进行松弛。
从x出发对所有出边进行松弛。
从y出发对所有出边进行松弛。
从z出发对所有出边进行松弛。
5.Dijkstra[/b]算法[/b]Dijkstra算法解决的是带权的有向图上的单源点最短路径问题,但要求其权值不能为负数。一个实现很好的Dijkstra算法要比Bellman-ford算法运行时间要低。算法总是在V-S中选择最近的顶点加入到S集合中,所以说使用了贪心策略。V是顶点的集合,S是从源结点s到集合中的顶点的最终最短路径的权值均已经确定。例子:原图:
将s加入到S集合中,从s出发修改其邻接点的d值(从源结点s到v结点的最短路径的上界)。
选择一个距离s最近的y结点,将y加入S集合中,从y结点开始对每一条出边进行一次松弛操作。
选择一个不在S集合中的且d值最小的结点z,对z的所有的出边进行一次松弛操作。
选择一个不在S集合中的且d值最小的结点t,对t的所有的出边进行一次松弛操作。
最后一次操作:
代码实现:
总思路:1. 找到从源结点v0可达的结点中最短的一个结点v,将v加入到结果集finial中。2. 从该结点v出发,检测是否有一个结点w,使得minV
+ mygraph.weight[v][w] < D[w] ,若有则记录下来,记录其路径(w包括自己)