Graph Traversal

Depth-First****Search

Idea

Let G= (V,E) be a directed or undirected graph. A depth-first search traversal of Gworks as follows. First, all vertices are marked unvisited. Next, a starting vertex is selected, say vV, and marked visited. Let wbe any vertex that is adjacent to v. We mark was visitedand advance to another vertex, say x, that is adjacent to wand is marked unvisited. Again, we mark xas visitedand advance to another vertex that is adjacent to xand is marked unvisited. This process of selecting an unvisited vertex adjacent to the current vertex continues as deep as possible until we find a vertex ywhose adjacent vertices have all been marked visited. At this point, we back upto the most recently visited vertex, say z, and visit an unvisited vertex that is adjacent to z, if any. Continuing this way, we finally return back to the starting vertex v. This method of traversal has been given the name depthfirst**search, as it continues the search in the forward (deeper) direction.


Algorithm 8.1 DFS
The case of undirected graphs

---- Tree edges

Edges in the depth-first search tree. An edge (v,w) is a tree edge if wwas first visited when exploring the edge (v,w).

---- Back edges

All other edges.

---- Example 8.1

Example 8.1Figure 8.1(b) illustrates the action of depth-first search traversal on the undirected graph shown in Fig. 8.1(a). Vertex ahas been selected as the start vertex. The depth-first search tree is shown in Fig. 8.1(b) with solid lines. Dotted lines represent back edges. Each vertex in the depth-first search tree is labeled with two numbers: predfn and postdfn. Note that since vertex ehas postdfn = 1, it is the first vertex whose depth-first search is complete. Note also that since the graph is connected, the start vertex is labeled with predfn = 1 and postdfn = 10, the number of vertices in the graph.

无向图

前序根节点为1

每往下一次加1

到底后倒序 底部后序为1退到再次有分叉的地方 注意当节点相邻节点有未访问时 后序还未开始计算 到最后回到根节点时 没有访问过的边也要让两节点相连 不过以虚线相连
Algorithm 8.1 DFS
The case of directed graphs

---- Tree edges, Back edges, Forward edges, Cross edges

Tree edges: edges in the depth-first search tree. An edge (v,w) is a tree edge if wwas first visited when exploring the edge (v,w).

Back edges: edges of the form (v,w) such that wis an ancestorof vin the depth-first search tree (constructed so far) and vertex wwas marked visitedwhen (v,w) was explored.

Forward edges: edges of the form (v,w) such that wis a descendantof vin the depth-first search tree (constructed so far) and vertex wwas marked visitedwhen (v,w) was explored.

---- Cross edges: All other edges.

---- Example****8.2

Example****8.2Figure 8.2(b) illustrates the action of depth-first search traversal on the directed graph shown in Fig. 8.2(a). The other result of the depth-first search traversal is shown in Fig. 8.2(c).

有向图

根据方向进行访问 其余与无向图相同

但是 当访问回根节点时 还没有访问完所有节点 此时挑选剩余节点中能往下走的起点开始 其先序为前面先序max加1 到底后(根据原有规则 先序一直加1)后序为根节点后序加1

方向为祖先指向子代的为forward edge

子代指向祖先的为back edge 直接祖先?直接看画出的序列图 通过实线直接或间接连接 就存在直接?祖先子代关系

其余的为cross edge
Time complexity of depth-first search
• Θ ( m + n ) ( adjacency list ) Θ ( n** 2 ) ( an adjacency matrix )

Applications of Depth-First Search
Finding articulation points in a graph

A vertex vin an undirected graph Gwith more than two vertices is called an articulation pointif there exist two vertices uand wdifferent from vsuch that any path between uand wmust pass through v. Thus, if Gis connected, the removal of vand its incident edges will result in a disconnected subgraph of G. A graph is called biconnected if it is connected and has no articulation points. To find the set of articulation points, we perform a depth-first search traversal on G. During the traversal, we maintain two labels with each vertex v ∈ V: α[v] and β[v]. α[v] is simply predfn in the depth-first search algorithm, which is incremented at each call to the depth-first search procedure. β[v] is initialized to α[v], but may change later on during the traversal. For each vertex vvisited, we let β[v] be the minimum of the following:

*•*α[v] = predfn.

• α[u] for each vertex usuch that (v, u) is a back edge.

*•*β[w] for each edge (v,w) in the depth-first search tree.

i.e.

b**[v]=min{a[v], min{b[w]|w is a son of v},**

min**{a[u]|(v,u) is a back edge} }****;**

n The articulation points are determined as follows:

*•*The root is an articulation point if and only if it has two or more children in the depth-first search tree.

*•*A vertex vother than the root is an articulation point if and only if vhas a child wwith β[w] ≥ α[v].

First, the algorithm performs the necessary initializations. In particular, count is the number of articulation points, and rootdegree is the degree of the root of the depth-first search tree. This is needed to decide later whether the root is an articulation point as mentioned above. Next the depth-first search commences starting at the root. For each vertex vvisited, α[v] and β[v] are initialized to predfn. When the search backs up from some vertex wto v, two actions take place. First, β[v] is set to β[w] if β[w] is found to be smaller then β[v]. Second, if β[w] ≥ α[v], then this is an indication that vis an articulation point.

This is because any path from wto an ancestor of vmust pass through v. This is illustrated in Fig. 8.4 in which any path from the subtree rooted at wto umust include v, and hence vis an articulation point. The subtree rooted at wcontains one or more connected components. In this figure, the root uis an articulation point since its degree is greater than 1.

Example 8.3 We illustrate the action of Algorithm ARTICPOINTS by finding the articulation points of the graph shown in Fig. 8.1(a). See Fig. 8.5. Each vertex vin the depth-first search tree is labeled with α[v] and β[v]. So vertices b, c, g and h are articulation points.
Strongly connected components

Given a directed graph G= (V,E), a strongly connected componentin Gis a maximalset of vertices in which there is a path between each pair of vertices. Algorithm STRONGCONNECTCOMP uses depth-first search in order to identify all the strongly connected components in a directed graph.Example 8.4 Consider the directed graph Gshown in Fig. 8.2(a). Applying depth-first search on this directed graph results in the forest shown in Fig. 8.2(b). Also shown in the figure is the postordering of the vertices, which is *e, f, b, a, d, c.*If we reverse the direction of the edges in G, we obtain G, which is shown in Fig. 8.6(a).

Starting from vertex cin G, a depth-first search traversal yields the tree consisting of vertex conly. Similarly, applying depth-first search on the remaining vertices starting at vertex dresults in the tree consisting of only vertex d. Finally, applying depth-first search on the remaining vertices starting at vertex ayields the tree whose vertices are a, b, e, and f. The resulting forest is shown in Fig. 8.6(b). Each tree in the forest corresponds to a strongly connected component. Thus, Gcontains three strongly connected components.

Idea

Unlike depth-first search, in breadth-first search when we visit a vertex v, we next visit all vertices adjacent to v. The resulting tree is called a breadthfirstsearchtree. This method of traversal can be implemented by a queue to store unexamined vertices. Algorithm BFS for breadth-first search can be applied to directed and undirected graphs. Initially, all vertices are marked unvisited. The counter bfn, which is initialized to zero, represents the order in which the vertices are removed from the queue. In the case of undirected graphs, an edge is either a tree edge or a cross edge. If the graph is directed, an edge is either a tree edge, a back edge, or a cross edge; there are no forward edges.

Example 8.5 Figure 8.7 illustrates the action of breadth-first search traversal when applied on the graph shown in Fig. 8.1(a) starting from vertex a.
Time complexity

The time complexity of breadth-first search when applied to a graph (directed or undirected) with nvertices and medges is the same as that of depth-first search, i.e., Θ(n+ m). If the graph is connected or *m ≥*n, then the time complexity is simply Θ(m).

Applications of Breadth-First Search

Problem

Let G= (V,E) be a connected undirected graph and sa vertex in V. Find the distance from s to any other vertex. (where the distance from sto a vertex vis defined to be the least number of edges in any path from sto v.)
Solution

This can easily be done by labeling each vertex with its distance priorto pushing it into the queue. Thus, the start vertex will be labeled 0, its adjacent vertices with 1, and so on. Clearly, the label of each vertex is its shortest distance from the start vertex. For instance, in Fig. 8.7, vertex awill be labeled 0, vertices band gwill be labeled 1, vertices c, f, and hwill be labeled 2, and finally vertices *d, e,*i, and jwill be labeled 3.

相关推荐
真就死难3 小时前
完全日期(日期枚举问题)--- 数学性质题型
算法·日期枚举
不知道取啥耶3 小时前
C++ 滑动窗口
数据结构·c++·算法·leetcode
花间流风3 小时前
晏殊几何学讲义
算法·矩阵·几何学·情感分析
@心都3 小时前
机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程
人工智能·算法·机器学习
北顾南栀倾寒6 小时前
[算法笔记]cin和getline的并用、如何区分两个数据对、C++中std::tuple类
笔记·算法
一只大侠7 小时前
牛客周赛A:84:JAVA
算法
豆豆酱7 小时前
Informer方法论详解
算法
槐月初叁7 小时前
多模态推荐系统指标总结
算法
迪小莫学AI8 小时前
LeetCode 2588: 统计美丽子数组数目
算法·leetcode·职场和发展
昂子的博客8 小时前
热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
算法