这个的证明我们使用数学归纳法,同时涉及到了割和穿越边的概念;因此我们先导入下这个名词。
割是什么
在无向联通图 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 个顶点
开始证明:
- 当n=1 时,只有一个顶点s,则 w(s,s)=0 ,因此d[s]=0
- 假设 当n=k时成立,则有k个节点的最短路径都已知道,且都可以用d[ v i v_i vi]获得,其中 1 ≤ i ≤ k 1\leq i \leq k 1≤i≤k;
- 当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真实的最短路径的以证明。