vlambda博客
学习文章列表

图与深度优先、广度优先搜索

图的表示

整体思路:问题——图——矩阵

邻接矩阵

两点之间是否有关系,用如下函数表示:

$$a_{ij}=1(如果i到j是联通的)$$

表示成矩阵的形式:

i\j 1 2 ...
1 . 1
2 1 .
...


如果不存在方向,矩阵是对称的。

邻接表

将每一个节点表示在图上,相邻节点之间有关系,就用实线连接,可以利用箭头表示方向。

深度优先搜索(DFS)

深度优先搜索算法

从一个顶点出发,访问其所能到达的一个节点,如果存在多个节点可以到达,利用规则(如:字母表顺利、随机)选择一个。一旦到底,就返回到上一个可供选择的节点,在该节点选择其它路径。

可能使用的结构:布尔变量标记是否存在多条路径、利用堆栈回溯

前序与后序

前序:顶点最先被访问(previsit)的时刻

后序:顶点最后离开(postvisit)的时刻

图与深度优先、广度优先搜索

每个节点上标注的数字分别是前序与后序。

边的类型

树边:实际走过的部分

前向边:树中从一个顶点指向该顶点的一个非子顶点后裔的边

回边:树中从一个顶点指向其祖先的边

横跨边:从一个顶点指向一个已经完全访问顶点的边

图与深度优先、广度优先搜索

有向无环图

环指的是形如$v_0\to v_1\to v2 \to v_0$的循环路径

性质:有向图含有一个环当且仅当深度优先搜索过程中探测到一条回边,每个有向无环图至少含有一个源点和一个汇点。

有向有环图

连通性:如果从顶点$u$到$v$,以及$v$到$u$各存在一条路径,则称$u$与$v$是联通的。(可以理解为子群是阿贝尔群,便是联通的)

强连通部件:将这些两两之间具有连通性的节点,认为是一个大节点,然后形成的简化后的图称为强连通部件。

性质:每个有向图关于其强连通部件都是一个有向无环图。

图与深度优先、广度优先搜索

广度优先搜索(BFS)

广度优先搜索算法

讨论图论中最短距离的算法

计算从$s$到其它顶点距离的方式是,按照层次进行逐层处理,起初队列$Q$中只含有$s$(即距离为$0$的点)。对于后续距离为$d=1,2,3....$$Q$中分别曾一度只包含距离为$d$的顶点。随着这些顶点被逐个处理(从队列中删除),这些顶点的未发现邻居被插入队列。

边的长度

不同的相邻顶点之间的开销不一致,从$v\to u$的开销记为$l(v,u)$。

Dijkstra算法

在相邻两点之间具有非负距离时,计算任意两点之间的最短距离。

思想:

1.从$s$出发,$s$记为$0$,其余顶点距离为$\infin$2.记录$s$到达的临近点距离,更新距离3.除去已经走过的点,从其余点中选择一个最近点4.认为新选择的点是新的$s$点,重复步骤2,直到所有点都更新完

图与深度优先、广度优先搜索图与深度优先、广度优先搜索图与深度优先、广度优先搜索图与深度优先、广度优先搜索

Bellman-Ford算法

Dijkstra算法只能计算不含负边的图,为计算含有负边的图引入Bellman-Ford算法。

思想:

与Dijkstra算法类似,也是通过不断更新距离达到计算最短距离的目的。但是,这里更新不是只更新最近点周围的节点的值,而是更新所有已经走过的节点的周围的节点值。


References

[1] Sanjoy Dasgupta, Christos Papadimitriou著. 王沛, 唐扬斌, 刘齐军 译. 算法概论. 清华大学出版社. 2008.