其他算法-Dijkstra

目录

  • 连通图
  • Dijkstra简介
  • 算法过程

连通图

图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。例如下图,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-V2-V3 和 V1-V4-V3,因此称 V1 和 V3 之间是连通的:
其他算法-Dijkstra_第1张图片
无向图中,如果任意两个顶点之间都能够连通,则称此无向图为连通图。若无向图不是连通图,但图中存储某个子图符合连通图的性质,则称该子图为连通分量;

在一幅有向图中,如果从顶点v有一条有向路径可到达顶点w,则顶点w是从顶点v可达的。如果两个顶点互相可达,则它们是强连通的。如果一幅有向图中任意两个顶点都是强连通的,则这幅有向图也是强连通的。

强连通性将所有顶点分成了平等的部分,每个部分都是由相互均为强连通的顶点的最大子集组成。这些子集称为强连通分量(强连通分支)。

Dijkstra简介

Dijkstra算法(地杰斯特拉),用于求单源图的最短路径,作者是Edsger Wybe Dijkstra,荷兰人,于1959年提出该算法;

输入:

  • 1.(连通)带权(有向)图;无向图是特殊的有向图,节点A与B连接可以看作节点A指向节点B且节点B也指向节点A;
  • 2.起点 s(源),由于图中只有一个源,故称为单源图;
  • 3.所有边的权,注意应该是非负数;

输出为源 s 到各个节点的最短路长度;

算法过程

Dijkstra的本质是贪心算法,设置节点编号为{ 0 , . . . , n − 1 0,...,n-1 0,...,n1},起点任取 0 ≤ s < n 0\leq s0s<n;初始化距离数组 d d d
d [ s ] = 0 , d [ i ] = ∞ , 0 ≤ i < n , i ≠ s d[s]=0,d[i]=\infty ,0\leq id[s]=0,d[i]=,0i<n,i=s
算法流程为:

  • 1.设置节点集合 V = { } V=\left\{\right\} V={}为空集,并初始化距离数组;
  • 2.循环 n n n次:
    a.找到 i ∉ V i\notin V i/V,且 d [ i ] d[i] d[i]值最小的节点 i i i
    b. V = V + i V=V+i V=V+i,找到所有满足 j ∉ V j\notin V j/V的边 ( i , j ) (i,j) (i,j),进行更新:
    d [ j ] = m i n ( d [ j ] , d [ i ] + w e i g h t ( i , j ) ) d[j]=min(d[j],d[i]+weight(i,j)) d[j]=min(d[j],d[i]+weight(i,j))

你可能感兴趣的:(白景屹-算法栈,图论,算法,数据结构)