连通图
图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。例如下图,虽然 V1 和 V3 没有直接关联,但从 V1 到 V3 存在两条路径,分别是 V1-V2-V3 和 V1-V4-V3,因此称 V1 和 V3 之间是连通的:

无向图中,如果任意两个顶点之间都能够连通,则称此无向图为连通图。若无向图不是连通图,但图中存储某个子图符合连通图的性质,则称该子图为连通分量;
在一幅有向图中,如果从顶点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,...,n−1},起点任取
0
≤
s
<
n
0\leq s<n
0≤s<n;初始化距离数组
d
d
d:
d
[
s
]
=
0
,
d
[
i
]
=
∞
,
0
≤
i
<
n
,
i
≠
s
d[s]=0,d[i]=\infty ,0\leq i<n,i\neq s
d[s]=0,d[i]=∞,0≤i<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))

543

被折叠的 条评论
为什么被折叠?



