证明 dijskra 最短路径算法成立

这个的证明我们使用数学归纳法,同时涉及到了割和穿越边的概念;因此我们先导入下这个名词。

割是什么

在无向联通图 G=(V,E)中: 若对于x∈V, 从图中删去节点x以及所有与x关联的边之后, G分裂成两个或两个以上不相连的子图, 则称x为G的割点。 简而言之, 割点是无向联通图中的一个特殊的点, 删去中这个点后, 此图不再联通, 而所以满足这个条件的点所构成的集合即为割点集合。
在这里插入图片描述就是说 如果去掉割点,这个图就会变成两个不联通的图。

什么是穿越边(割边)

现在还不太清楚,穿越边可能就是割边;下面说下割边的定义,就是说,没有割边,这个图就会变成两个不联通的图。或者说是相邻两个割点组成的边就是割边。如下图红线所示,就是一条割边或者说穿越边。
在这里插入图片描述

dijskra 最短路径算法

下面简单介绍下什么是dijskra 最短路径算法

Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。

基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。

下面使用数学归纳方法进行证明:
形式化定义:
d[a] 表示 源点到点a的最短路径长度
w(a,b) 表示顶点a到顶点b的权重
v i v_i vi表示在顶点集合中的第k个顶点
s 表示源点,u表示第k+1 个顶点
开始证明:

  1. 当n=1 时,只有一个顶点s,则 w(s,s)=0 ,因此d[s]=0
  2. 假设 当n=k时成立,则有k个节点的最短路径都已知道,且都可以用d[ v i v_i vi]获得,其中 1 ≤ i ≤ k 1\leq i \leq k 1ik;
  3. 当n=k+1 时 ,我们要证明 算法生成的最短路径 d [ u ] ^ \hat{d[u]} d[u]^确实是源s到u真实的最短路径;
    下面我们定义一个割点y,将图划分为两个不连通子图S,和V-S,其中u包含在V-S中;同时,设这条割边(穿越边)为 p 1 p_1 p1,与 p 1 p_1 p1相连的另一个顶点为x,如下图所示
    在这里插入图片描述下面,我们使用反证法,假设算法得出的边不是最短路径,那么一定有一条路径P从点s到u,比 d [ u ] ^ \hat{d[u]} d[u]^ 更短。假设这个路径为 d [ u ] ∗ d[u]^* d[u],则有
    d [ u ] ∗ = d [ x ] + w ( x , y ) + w ( y , u ) d[u]^* =d[x]+w(x,y)+w(y,u) d[u]=d[x]+w(x,y)+w(y,u)由于顶点x在已知范围内,也就是说d[x]是已经确定的,所以,在求d[y]的时候边p1 是一条备选边,也就是说他可能是最短的,也可能不是,那么必有
    d [ y ] ≤ d [ x ] + w ( x , y ) d[y] \leq d[x]+w(x,y) d[y]d[x]+w(x,y)同时 由于图中无负权值,所以必有
    d [ y ] ≤ d [ x ] + w ( x , y ) ≤ d [ x ] + w ( x , y ) + w ( y , u ) = d [ u ] ∗ d[y] \leq d[x]+w(x,y) \leq d[x]+w(x,y)+w(y,u)=d[u]^* d[y]d[x]+w(x,y)d[x]+w(x,y)+w(y,u)=d[u]
    也就是说
    d [ y ] ≤ d [ u ] ∗ d[y] \leq d[u]^* d[y]d[u]
    如果这样的话 那么算法在选取第k+1 个点时,应该选择y 而不是选择u ,这与算法所提出的要求不符合(算法确定一个新的顶点,总是会选择最近的点),因此不存在比 d [ u ] ^ \hat{d[u]} d[u]^ 更短的路径 。
    从而 d [ u ] ^ \hat{d[u]} d[u]^是源s到u真实的最短路径的以证明。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值