半期后开始的第一个算法是图。这部分内容蛮多的,老师也讲的很快。所以写作业之前还是先梳理一下。这部分会分为两次课,这是第一部分。
首先是图里最简单和经典的深度优先搜索(Depth-FirstSearch)和广度优先搜索(Breadth-First Search)。
先需要了解一个对图的遍历。输入一个图G=(V, E), v ∈V,如果对从v出发的所有结点u都可达,那么VISITED(u)就设为true。
其中,PREVISIT 和 POSTVISIT算法是可选。当一个顶点是第一次被遍历或者是最后一次被剩下,这两个方法才会被调用。
可以证明,EXPLORE(G, v)是正确的,也就是说,可以访问到所有从v可达的结点。这里简单证明一下,从两个方面。首先它访问的每个结点都一定是可以从v可达的,因为该算法只从结点移动到它们的邻居结点,因此不能够跳到v不可达的区域;其次,每一个从v可达的结点最终都会被访问到,我们假设有某个结点u被该算法忽略了,选择任何从v到u的路径,观察这个过程中在该路径上实际最后访问的结点z。令w为相同路径之后下一个要访问的结点,因此z会被访问,但是w不能。这就产生一个矛盾,如果该算法能够访问到z,那么肯定就可以观察到w,并移动到w的位置访问。
DFS的算法过程如下:
一个例子,假设我们使用字母表的顺序来遍历G: