贪心算法-图的最短路径算法Dijkstra之证明

一、问题:图的最短路径

  定义图G=(V,E),而且每条边上的权值非负,求顶点s 到图中任意一点的最短距离。图中任意两点之间的距离定义为:路径上所有边的权值的和。

二、算法:Dijkstra算法

  设S是探查的顶点的集合,对每个,我们存储一个距离d(u)

  初始S={s},d(s)=0

    While S != V

      选择一个顶点使得从S到v至少有一条边并且

      

      把v加入到S并且定义

    End

三、证明算法的正确性:

  只需证明,在算法执行中任意一点的集合S,对每个,路径是最短的s-u路径。

 用数学归纳法证明算法的正确性:

  1. |S|=1 时, S={s},d(s)=0 显然成立
  2. 假设|S|=k时,命题成立

   既对每个,路径Pu是最短的s-u路径

  3. |S|=k+1

   假设此时引入的顶点是v,令(u,v)是s-v路径上最后的一条边。

   现在我们证明是s-v的所有路径中最短的路径。

   s要到达v,必须首先离开S,然后到达y,最后y到达v

   该距离:

   而从Dijkstra算法知,

   又因为,图中所有边的权值非负,

   所以有:

      故而Pv是s-v的所有路径中最短的路径。

原文地址:https://www.cnblogs.com/ordili/p/8496752.html

时间: 2024-11-07 01:26:43

贪心算法-图的最短路径算法Dijkstra之证明的相关文章

python数据结构与算法——图的最短路径(Dijkstra算法)

1 # Dijkstra算法——通过边实现松弛 2 # 指定一个点到其他各顶点的路径——单源最短路径 3 4 # 初始化图参数 5 G = {1:{1:0, 2:1, 3:12}, 6 2:{2:0, 3:9, 4:3}, 7 3:{3:0, 5:5}, 8 4:{3:4, 4:0, 5:13, 6:15}, 9 5:{5:0, 6:4}, 10 6:{6:0}} 11 12 13 # 每次找到离源点最近的一个顶点,然后以该顶点为重心进行扩展 14 # 最终的到源点到其余所有点的最短路径 15

带权图的最短路径算法(Dijkstra)实现

一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的.不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现):而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”.本文采用最小堆主辅助,以重新构造堆的方式实现更新邻接点权值. 对于图而言,存在有向图和无向图.本算法只需要修改一行代码,即可同时实

算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行"放松"操作.这种算法的复杂度是E+V. 代码 这种算法的代码比Dijkstra还要简单,代码如下: public class TopologySP extends SP { public TopologySP(EdgeWeightedDigraph G, int s) { super(G, s); // 将所有顶点到原点的距离设为无穷大 // 注意:下面这段代码不要遗漏 fo

算法8-11:最短路径算法之负权

负权指的是一张图中包含一条权重小于0的边.负环指的是一张图中存在权重只和为负数的环.如果一张图中存在负环,那么这张图是没有最短路径的. 那么,假设图中不存在负环,但是有负权,那么最短路径如何求解呢?答案就是使用Bellman-Ford算法,该算法的性能一般. 基本思想 Bellman-Ford算法的基本思想就是对图中所有的边都进行V次"放松"操作.所以该算法的复杂度是E×V. 该算法的计算过程如下图所示. 改进 实际应用中会对算法进行改进.改进方法就是用队列记录发生变化的顶点,这样能减

有向有权图的最短路径算法--Dijkstra算法

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法, 在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径) 2.算

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

数据结构与算法--单源最短路径算法之dijkstra

单源最短路径之dijkstra算法 最优子问题:dis(s,...,e)是s到e的最短路径,在这条路径上的所有点之间dis(pi,pj)距离是最小的. 算法思路: 首先初始化,dis[s][i]是s到i的距离,直接相连的就是其距离,不直接相连的就是无穷大 下面是算法主要模块: 1.选取dis[i]最小的点加入到P{S}中, 2.计算是否更新dis[j],j是和i直接相连的 3.重复以上步骤,直到e

图的最短路径学习(Dijkstra)

1:Dijkstra算法 本算法可以算是贪心算法的实现,通过从起点出发去寻找与其他点的最短距离,找到该最短距离的顶点,然后里该顶点为中转点,去寻找 以中转点出发的到其他顶点更近的距离,从而通过一步步的选择找到最优的路径! 2:算法流程 流程如上图所示,v0到其他顶点的距离设置成一个数组path[0,1,5,65535,65535,65535,65535,65535,65535]其中,65535代v0待这个点之间距离无穷大.首先在path中找到最近的一个顶点为v1,然后我们以v1为中转点来更新该数

SPFA算法-单源最短路径算法

1.介绍: SPFA算法:单源最短路径算法,一种高效的最短路径算法! 2.思路 (1)初始化 1>源点路径为0  :d[s]=0 ,其中s为源点 2>初始化d[N]为无穷大,即d[i]表示,源点s到i为无穷大INF 3>p[N]初始化为源点s或-1,表示没有前驱 (2)队列+松弛 1>读取队头顶点u,并将队头顶点u出队(记得消除标记): 2>将与点u相连的所有点v进行松弛操作,如果能更新估计值(即令d[v]变小),那么就更新; 3>另外,如果点v没有在队列中,那么要将点